使用Mockito在方法调用上拦截对象

我有一个类似于void方法的模拟类

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,解析它并检查对象。

您正在寻找ArgumentCaptor

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

还有一种方法可以做到这一点,例如:

 Mock mock = Mockito.mock(Mock.class); when(mock.method(any(String.class))).thenAnswer(new Answer() { @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"); 

只是提炼@softarn的答案以匹配OP的例子,参考这里

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