私は次のような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をインターセプトして解析し、オブジェクトをチェックすることです。
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();
これを行う方法がもう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");
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());