运行以下内容时,我从PowerMock收到错误:
whenNew(Socket.class).withAnyArguments().thenReturn(server).thenCallRealMethod();
错误是:
你可能存储了对when()和返回的OngoingStubbing的引用 这个引用不止一次地调用了像thenReturn()这样的存根方法。
正确用法示例: 当(mock.isOk())thenReturn(真).thenReturn(假).thenThrow(例外)。 when(mock.isOk())。thenReturn(true,false).thenThrow(exception);
知道如何在第一个new
上返回我的模拟对象,然后调用默认构造函数吗?
答案 0 :(得分:0)
我不知道任何内置解决方案,但尝试这个,它应该工作:
whenNew(Socket.class).withAnyArguments().thenAnswer(new Answer<Object>() {
boolean firstCall;
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
if (firstCall) {
firstCall = false;
return server;
}
return invocationOnMock.callRealMethod();
}
});
使用thenAnswer
,您可以实现在Answer
内模拟方法的任何逻辑。
所以,如果你经常需要这样的行为,我建议你将它封装到这样的类中:
class MockOnlyFirstCall<T> implements Answer<T> {
private final T firstCallResult;
private boolean firstCall = true;
public MockOnlyFirstCall(T firstCallResult) {
this.firstCallResult = firstCallResult;
}
@Override
public T answer(InvocationOnMock invocationOnMock) throws Throwable {
if (firstCall) {
firstCall = false;
return firstCallResult;
}
return invocationOnMock.callRealMethod();
}
}
然后你可以做
whenNew(Socket.class)
.withAnyArguments()
.thenAnswer(new MockOnlyFirstCall<>(server));