![](/img/trans.png)
[英]Mocking file operations in a unit test using junit and PowerMockito doesn't work
[英]Mocking constructor using PowerMockito doesn't work
我想测试一种使用其参数化构造函数创建另一个类的对象的方法。 即使我嘲笑MyClass的构造函数,它也会使第三方库处于构造函数实现中并导致错误。 我正在使用Mockito / PowerMockito。
public class MyClass{
private MyObj obj;
MyClass (String profile)
{
//some 3rd party library call
obj = thridPartyLib.someMethod(profile);
}
public String someMethod(){
return obj.someExternalCall();
}
}
我要测试的课程
public class ClassTobeTested{
public void execute(){
//some code
// ......
MyClass myClass = new MyClass(profile);
myclass.someMethod();
}
}
到目前为止,我一直在尝试classUnderTest.execute()
最终调用thridPartyLib.someMethod(profile);
这是MyClass构造函数的一部分。
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class ClassTobeTestedTest {
private MyClass mockMyClass;
private ClassTobeTested classUnderTest;
@Before
public void init() {
classUnderTest = new ClassTobeTested();
mockMyClass = PowerMockito.mock(MyClass.class);
}
@Test
public void testExecute(){
PowerMockito.whenNew(MyClass.class)
.withArguments(Mockito.any())
.thenReturn(mockMyClass);
classUnderTest.execute();
}
}
您的代码仅在使用classUnderTest的间谍程序或模拟程序时才有效。 尝试这个。 这应该工作
@RunWith(PowerMockRunner.class)
@PrepareForTest( {MyClass.class, ClassTobeTested.class })
public class ClassTobeTestedTest {
private MyClass mockMyClass;
private ClassTobeTested classUnderTest;
@Before
public void init() {
classUnderTest = spy(new ClassTobeTested());
mockMyClass = PowerMockito.mock(MyClass.class);
}
@Test
public void testExecute() throws Exception {
PowerMockito.whenNew(MyClass.class)
.withArguments(Mockito.any())
.thenReturn(mockMyClass);
classUnderTest.execute();
}
}
痛苦可能暗示了另一种方法。 考虑将Factory注入到ClassTobeTested
, ClassTobeTested
知道如何创建MyObj
的实例。 例如:
class MyObjFactory {
MyObj create(String profile) {
return new MyClass(profile);
}
}
然后
public class ClassTobeTested {
private final MyObjFactory factory;
public ClassTobeTested(MyObjFactory factory) {
this.factory = factory;
}
public void execute(){
//some code
// ......
// MyClass myClass = new MyClass(profile);
MyClass myClass = factory.create(profile);
myclass.someMethod();
}
}
因此,单元测试变得更加简单,只需要模拟Factory并使其返回模拟的MyClass
实例即可。 然后,很容易验证myclass.someMethod()
是否按预期被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.