如何使用PowerMock模拟构造函数的不同响应

时间:2015-06-29 13:25:12

标签: java powermock

运行以下内容时,我从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上返回我的模拟对象,然后调用默认构造函数吗?

1 个答案:

答案 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));