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

Enr*_*man 23 java mocking mockito

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

public class Mock {
    public void method(String string) {
        // doSomething
    }
}
Run Code Online (Sandbox Code Playgroud)

我不关心这个方法做什么,但我想得到String发送.

这个String实际上是一个JSON格式的对象,我正在测试的方法是根据最初发送的字符串修改这个对象(很随意吧).

method(String json) {
    Object obj = unparse(json);
    obj.setRandomValue(random);
    String parsed = parse(obj);
    Mock.method(parsed);
}
Run Code Online (Sandbox Code Playgroud)

我想看看之前为null的"randomValue"是否实际上是在方法调用之后随机设置的.

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

Urs*_*pke 44

您正在寻找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();
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!谢谢,这正是我一直在寻找的! (2认同)

Min*_*nas 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");
Run Code Online (Sandbox Code Playgroud)