doAnswer用于静态方法 - PowerMock

Ran*_*ion 7 java mocking powermock

我正在使用的静态方法之一,它做了两件事.它返回一些数据,但它也修改传递给它的参数对象.然后在代码中使用此更新的参数对象.

我正在使用PowerMock来模拟返回行为.

为了定义第二部分 - 更新输入参数,我正在定义doAnswer方法,但它不起作用.我正在尝试测试的方法看起来像这样.

public void login() throws ConnectionException, AsyncApiException {
    ConnectorConfig partnerConfig = new ConnectorConfig();

    //This call sets the value in one member variable 'serviceEndPoint in ParterConfig which is accessed later in this method only.
    partnerConnection = Connector.newConnection(partnerConfig);

    //partnerConfig.getServiceEndpoint is called.

    PowerMockito.mockStatic(Connector.class);
    when(Connector.newConnection(Mockito.any(ConnectorConfig.class))).thenReturn(partnerConnection);

    PowerMockito.doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) {
            ConnectorConfig config = (ConnectorConfig) invocation.getArguments()[0];
            config.setServiceEndpoint("service end point");
            return null;
        }
    }).when(Connector.newConnection(Mockito.any(ConnectorConfig.class)));
}     
Run Code Online (Sandbox Code Playgroud)

但是上面抛出的错误说'在这里检测到未完成的短截'. Connector是第三方课程,所以我无法控制其行为.

有什么建议,可能会出错吗?

Jef*_*ica 16

PowerMockito.doAnswer(new Answer<Void>() {
    /* ... */
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class)));
Run Code Online (Sandbox Code Playgroud)

when的问题就在于此.在正常的Mockito,使用任何doAnswer/ doReturn的/ etc通话,你必须把你删呼叫的通话来when,像这样:

Mockito.doAnswer(new Answer<Void>() {
    /* ... */
}).when(yourMock).callVoidMethod();
//            ^^^^^^
Run Code Online (Sandbox Code Playgroud)

PowerMockito还要求在下一个语句中调用静态方法,如下所示:

PowerMockito.doAnswer(new Answer<Void>() {
    /* ... */
}).when(Connector.class); Connector.newConnection(/*...*/);
//                    ^^^^^^
Run Code Online (Sandbox Code Playgroud)

请注意,我链接文档实际上是不一致的 - 看起来文档提到了零arg when,而类文字在可用的签名中是必需的.如果你有一个时刻,那么标记为错误可能是件好事.

强制性PSA:尽管陪审团仍然在那个问题上,但通常最好避免使用你不拥有的嘲弄类型.