Java 如何用Easymock替换实例
我正在尝试使用EasyMock对一个类进行单元测试。为了简化事情,我在下面举了一个例子。我想要的是在测试期间将StringBuilder实例替换为EasyMock实例。(因为这不是我想要测试的StringBuilder的功能。)不幸的是,这在下面的示例中不起作用。在其他测试中,我有一个变通方法,通过使用EasyMock实例设置实例变量,但是在这个示例中,我无法做到这一点,因为我关心的是一个本地实例化的对象 谁能帮我 要测试的类别:Java 如何用Easymock替换实例,java,unit-testing,easymock,Java,Unit Testing,Easymock,我正在尝试使用EasyMock对一个类进行单元测试。为了简化事情,我在下面举了一个例子。我想要的是在测试期间将StringBuilder实例替换为EasyMock实例。(因为这不是我想要测试的StringBuilder的功能。)不幸的是,这在下面的示例中不起作用。在其他测试中,我有一个变通方法,通过使用EasyMock实例设置实例变量,但是在这个示例中,我无法做到这一点,因为我关心的是一个本地实例化的对象 谁能帮我 要测试的类别: package example.easymock public
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();
}
}
仅仅使用EasyMock是不可能的
PowerMock
确实包含这样做的功能,但是:
expectNew(StringBuilder.class).andReturn(stringMock);
当然,您需要正确设置PowerMock配置才能正常工作-请参阅更多
这并没有改变事实,正是这种不可能性(部分)导致了设计原则的广泛采用。此外,作为一项规则,任何无法测试的方法都是可以重构为更好(并且可以测试)的方法。PowerMock只应在代码本身无法更改为更好时用于测试
当然,这是假设
StringBuilder
只是一个示例,而不是您真正想要做的。如果是-不用麻烦了,您可以假设语言库中的任何方法都像广告中所宣传的那样工作。仅使用EasyMock
是不可能的PowerMock
确实包含这样做的功能,但是:
expectNew(StringBuilder.class).andReturn(stringMock);
当然,您需要正确设置PowerMock配置才能正常工作-请参阅更多
这并没有改变事实,正是这种不可能性(部分)导致了设计原则的广泛采用。此外,作为一项规则,任何无法测试的方法都是可以重构为更好(并且可以测试)的方法。PowerMock只应在代码本身无法更改为更好时用于测试
当然,这是假设
StringBuilder
只是一个示例,而不是您真正想要做的。如果是-不用麻烦了,您可以假设作为语言库一部分的任何方法都可以按照广告的方式工作。PowerMock可以影响类的模拟构造函数。因此,使用PowerMock是可能的。@dav1d该死,这是强大的,正确的。只需添加如何使用TestNG+PowerMock+Mockito进行测试,以防有用:准备要测试的类:`@PrepareForTest(SomeService.class)
然后只需“模拟”构造函数:whenNew(Date.class.),而不使用arguments()。然后返回(现在)代码>PowerMock可以影响类的模拟构造函数。因此,使用PowerMock是可能的。@dav1d该死,这是强大的,正确的。只需添加如何使用TestNG+PowerMock+Mockito进行测试,以防有用:准备要测试的类:`@PrepareForTest(SomeService.class)
然后只需“模拟”构造函数:whenNew(Date.class.),而不使用arguments()。然后返回(现在)代码>