1

Mockitoverify機能を使用してメソッドが何度も呼び出されたことを確認しようとしています。ただし、私が直面している問題は、メソッドがオーバーロードされているため、メソッドが呼び出されなかったと主張していることです。ミックスにレンチを追加するために、このメソッドに渡された引数が何であったかをキャプチャしたいと思います。これが私がこれまでに持っているものです:

@Test
public void simpleTest() throws IOException {
    FlumeAppender mockAppender = Mockito.mock(FlumeAppender.class);
    ArgumentCaptor<LoggingEvent> arguments = ArgumentCaptor.forClass(LoggingEvent.class);

    // Load the message that should be sent to the class being tested
    InputStream in = this.getClass().getResourceAsStream("/testMessage.xml");
    StringWriter writer = new StringWriter();
    IOUtils.copy(in, writer, "UTF-8");
    String testMessage = writer.toString();

    // Send a message to the class being tested. This class will 
    // (hopefully) call the function I am listening to below
    eventSubscriber.handleMessage(testMessage);

    // Verify that the append method was called twice
    Mockito.verify(mockAppender, Mockito.times(2)).append(
            arguments.capture());

    // Do something with the arguments
}

私が言ったように、私が検証 (追加) しようとしている関数はオーバーロードされています。引数をキャプチャしながら検証を求めている追加関数を指定することは可能ですか?

4

1 に答える 1

0

恥ずかしいことに、問題の解決策が単純なエラーの結果であることがわかりました。参考までに回答を掲載しておきます。

ArgumentCaptor を作成するときは、ジェネリックを使用して期待する引数の型を指定します。私はこれを行っていましたが、残念ながら、呼び出されるとは思っていなかったメソッドの他のバージョンのいずれかの型を使用しました。単純な間違い。

// This declaration
ArgumentCaptor<LoggingEvent> arguments = ArgumentCaptor.forClass(LoggingEvent.class);

// Should have been:
ArgumentCaptor<Event> arguments = ArgumentCaptor.forClass(Event.class);

これが正しければ、ArgumentCaptor の型を使用して確認するメソッドを決定し、verify 関数が期待どおりに動作するはずです。

とても近い...

于 2013-03-29T15:36:05.580 に答える