我正在尝试使用EasyMock对一个类进行单元测试。为简化起见,我在下面做了一个例子。我想要的是在测试期间将StringBuilder实例替换为EasyMock实例。 (因为它不是我想要测试的StringBuilder的功能。)不幸的是,这在以下示例中不起作用。在其他测试中,我通过使用EasyMock实例设置实例变量来解决方法,但是使用此示例我无法执行此操作,因为它是我关心的本地实例化对象。
谁能帮助我?
要测试的课程:
package example.easymock
public class Example {
public String exampleMethod() {
StringBuilder string = new StringBuilder();
string.append("hello");
return string.toString();
}
}
测试类:
package example.easymock
import needed classes
public class ExampleTest {
@Test
public void exampleMethodTest() {
StringBuilder stringMock = EasyMock.createMock();
Example example = new Example();
stringMock.append("hello");
EasyMock.expect(stringMock.toString()).andReturn("hi");
EasyMock.replay(stringMock);
example.exampleMethod();
}
}
答案 0 :(得分:2)
仅使用EasyMock
它是不可能的。 PowerMock
确实包含了这样做的权力:
expectNew(StringBuilder.class).andReturn(stringMock);
您需要正确设置PowerMock配置才能正常工作 - 请参阅更多here
这并没有改变这一事实,正是这种不可能性(部分)导致广泛采用Inversion of Control作为设计原则。此外,作为一项规则,您无法测试的任何方法都是可以重构为更好(和可测试)的方法。只有当代码本身无法更改时,PowerMock才能用于测试。
当然,假设StringBuilder
仅仅是一个例子,而不是字面上你想要做的事情。如果是 - 请不要打扰,您可以假设任何属于语言库的方法都像宣传的那样工作。