我正在使用的一种静态方法,它做了两件事.它返回一些数据,但它也修改传递给它的参数对象.然后在代码中使用此更新的参数对象.
我正在使用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() {
@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)));
}
但是上面抛出的错误说’在这里检测到未完成的短截’.
Connector是第三方类,所以我无法控制它的行为.
有什么建议,可能会出错吗?
解决方法:
PowerMockito.doAnswer(new Answer() {
/* ... */
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class)));
你什么时候出问题.在普通的Mockito中,使用任何doAnswer / doReturn / etc调用,你必须将调用之外的调用放在调用之外,如下所示:
Mockito.doAnswer(new Answer() {
/* ... */
}).when(yourMock).callVoidMethod();
// ^^^^^^
PowerMockito进一步要求对静态方法的调用发生在in the next statement,如下所示:
PowerMockito.doAnswer(new Answer() {
/* ... */
}).when(Connector.class); Connector.newConnection(/*...*/);
// ^^^^^^
请注意,documentation I linked实际上是不一致的 – 看起来文档提到了零arg时,而在可用的签名中需要类文字.如果你有一个时刻,那么标记为错误可能是件好事.
标签:java,mocking,powermock
来源: https://codeday.me/bug/20191005/1855799.html