我有一个像
这样的虚方法的模拟类public class Mock {
public void method(String string) {
// doSomething
}
}
我不关心这个方法的作用,但我想把String发送出去。
这个String实际上是一个JSON格式的对象,我正在测试的方法是修改这个对象,具体取决于最初发送的字符串(非常随意的说)。
method(String json) {
Object obj = unparse(json);
obj.setRandomValue(random);
String parsed = parse(obj);
Mock.method(parsed);
}
我想看看之前为null的“randomValue”是否实际上是在方法调用后使用随机设置的。
最好是截取json,解析它并检查对象。
答案 0 :(得分:42)
您正在寻找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 :(得分:7)
还有一种方法可以做到这一点,例如:
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");
答案 2 :(得分:1)
只是提炼@softarn的回答以匹配OP的例子,参考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());