7

私が使用している静的メソッドの 1 つは、2 つのことを行います。一部のデータを返しますが、渡される引数オブジェクトも変更します。この更新された引数オブジェクトは、後でコードで使用されます。

PowerMock を使用して戻り動作をモックしています。

2 番目の部分の定義 (入力引数の更新) のために、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はサードパーティ クラスなので、その動作を制御することはできません。

何か提案があれば、何がうまくいかないのでしょうか?

4

1 に答える 1

20
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 はさらに、静的メソッドの呼び出しが次のステートメントで発生することを次のように要求します。

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

2009 (~1.3.x)から2013 (~1.5.x)まで、ドキュメントは実際には一貫性がなく、when少なくともクラスリテラルを必要とするすべての署名にもかかわらず、ゼロ引数をほのめかしていたことに注意してください。

必須の PSA:所有していない型をモック化することは一般的には避けるのが良い考えですが、その型については意見が異なる場合があります

于 2013-08-06T00:10:24.283 に答える