我正在使用的静态方法之一,它做了两件事。它返回一些数据,但它也修改传递给它的参数对象。然后在代码中使用此更新的参数对象。
我正在使用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)));
}
但是上面抛出错误说&#39;在这里检测到未完成的存根&#39;。
Connector
是第三方课程,因此我无法控制其行为。
任何建议,可能出现什么问题?
答案 0 :(得分:16)
PowerMockito.doAnswer(new Answer<Void>() {
/* ... */
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class)));
您的when
是问题所在。在正常的Mockito中,使用任何doAnswer
/ doReturn
/ etc调用,您必须将调用> 调用when
,如同这样:
Mockito.doAnswer(new Answer<Void>() {
/* ... */
}).when(yourMock).callVoidMethod();
// ^^^^^^
PowerMockito还要求调用静态方法in the next statement,如下所示:
PowerMockito.doAnswer(new Answer<Void>() {
/* ... */
}).when(Connector.class); Connector.newConnection(/*...*/);
// ^^^^^^
请注意,documentation I linked实际上是不一致的 - 看起来文档提到零参数when
,而类标量在可用的签名中是必需的。如果你有一个时刻,那么将其标记为错误可能是一件好事。
强制性PSA: avoid mocking types you don't own通常是个好主意,尽管是jury's still out on that one。