web-dev-qa-db-ja.com

Mockitoでのメソッド呼び出しでのオブジェクトのインターセプト

私は次のようなvoidメソッドを持つモッククラスを持っています

public class Mock {
    public void method(String string) {
        // doSomething
    }
}

このメソッドが何をするかは気にしませんが、文字列を送信したいと思います。

この文字列は実際にはJSON形式のオブジェクトであり、私がテストしているメソッドは、最初に送信された文字列に応じてこのオブジェクトを変更しています(かなりランダムに言ってみましょう)。

method(String json) {
    Object obj = unparse(json);
    obj.setRandomValue(random);
    String parsed = parse(obj);
    Mock.method(parsed);
}

以前はnullだった "randomValue"が、メソッドの呼び出し後に実際にランダムに設定されているかどうかを確認したいだけです。

最善の方法は、jsonをインターセプトして解析し、オブジェクトをチェックすることです。

24
Enrichman

ArgumentCaptor を探しています:

  Mock mock =  Mockito.mock(Mock.class);
  ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
  mock.method("input");
  Mockito.verify(mock).method(captor.capture());
  String actualValue = captor.getValue();
45
Urs Reupke

これを行う方法がもう1つあります。例を次に示します。

Mock mock =  Mockito.mock(Mock.class);
when(mock.method(any(String.class))).thenAnswer(new Answer<Void>() {

        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            String actualValue = invocation.getArgumentAt(0, String.class);
            Assert.assertEquals("input", actualValue);
            return null;
        }
    });
// Test your method 
mock.method("input");
Mockito.verify(mock, Mockito.times(1)).method("input");
7

OPの例に一致するように@softarnからの回答を調整するだけで、リファレンス here

Mock mock =  Mockito.mock(Mock.class);
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mock).method(argument.capture());
assertEquals("{some pretty json string}", argument.getValue());
3
nilesh