java - 静态方法的 doAnswer - PowerMock

标签 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)));
}     

但上面会抛出错误,提示“此处检测到未完成的 stub ”。 Connector 是第三方类,所以我无法控制它的行为。

有什么建议,可能出了什么问题?

最佳答案

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

您的 when 是问题所在。在正常的 Mockito 中,使用任何 doAnswer/doReturn/etc 调用,您必须将要 stub 的调用放在 outside 调用 when,像这样:

Mockito.doAnswer(new Answer<Void>() {
    /* ... */
}).when(yourMock).callVoidMethod();
//            ^^^^^^

PowerMockito 进一步要求对静态方法的调用发生 in the next statement ,像这样:

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

请注意,来自 2009 (~1.3.x)2013 (~1.5.x) ,文档实际上是不一致的,暗示了一个零参数 when 尽管所有签名都至少需要一个类文字。

强制性 PSA: avoid mocking types you don't own 通常是个好主意, 虽然opinions may vary on that one .

关于java - 静态方法的 doAnswer - PowerMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18069396/

相关文章:

java - 适用于 Android slider 菜单的 slider 图标

Java获取键盘按键输入的函数

java - 如何使用 Mockito 为不同的参数设置不同的返回类型?

java - 如何验证父类的 super.method() 的调用?

java - 在 Mockito 2 中 stub 静态方法会抛出 InvalidUseOfMatchersException

java - 如何使用selenium java向左和向右移动 slider

java - 当按下其他键时,该键被取消注册

objective-c - Objective-C 的技巧?

java - 什么是 Kotlin 函数类型的 Java 等价物?

java - 另一个类的 Mockito 对象方法