【问题标题】:doAnswer for static methods - PowerMock静态方法的 doAnswer - PowerMock
【发布时间】:2013-08-05 23:22:29
【问题描述】:

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

我正在使用 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)));
}     

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

任何建议,可能会出现什么问题?

【问题讨论】:

    标签: java mocking powermock


    【解决方案1】:
    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(/*...*/);
    //                    ^^^^^^
    

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

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

    【讨论】:

    • 感谢文档链接。我明天试试看。
    • 这行得通。我已经提交了一个错误。主题不是指向,但我似乎无法编辑它。 code.google.com/p/powermock/issues/…
    • 我得到前 2 个链接的 404。
    • @cs_pupil 已更新。
    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多