我们可以使用以下行使用powermock模拟对象创建:
MyClass myObj = getMyObj();
PowerMockito.whenNew(MyClass.class).withAnyArguments().thenReturn(myObj);
现在在我正在编写测试用例的班级中,我有这种逻辑:
public class TestClass {
public void testMethod() {
MyClass obj = new MyClass();
boolean flag = doSomeOperation();
if(flag) {
MyClass obj1 = new MyClass();
//doSomeOtherOp();
}
}
}
这里我要模拟第二个对象创建obj1
,是否可以使用powermock控制我要模拟的对象。在这里,我不想模拟第一个对象obj
。
答案 0 :(得分:2)
我认为这很简单:
PowerMockito.whenNew(MyClass.class).withAnyArguments().thenReturn(firstResult)
.thenReturn(anotherResult);
但是不幸的是,尽管在其他情况下也可以链接,但是PowerMockito似乎不允许这样做。
(类似
when(someMock.toString()).thenReturn("a").thenReturn("b");
System.out.println(someMock.toString() +factory.toString();
恰好打印ab
! )
所以我现在唯一能给出的答案是:您编写了难以测试的代码。考虑不这样做。
与其依赖PowerMock模拟对new()
的调用,您应该退后一步并更改设计。例如,通过在生产代码中使用工厂。因此,您无需直接调用new()
,只需向工厂询问新实例即可。而且无需PowerMock(ito)即可轻松模拟该工厂。