28

我有一个带有 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);
}

我只想看看之前为空的“randomValue”是否在方法调用之后实际上是用随机设置的。

最好的办法是拦截 json,解析它并检查对象。

4

3 回答 3

52

您正在寻找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();
于 2012-09-03T08:42:06.877 回答
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");
于 2013-07-16T09:41:32.523 回答
2

只是完善@softarn 的答案以匹配 OP 的示例,参考这里

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());
于 2017-01-17T20:29:48.070 回答