【问题标题】:Intercept object on method invocation with Mockito在使用 Mockito 进行方法调用时拦截对象
【发布时间】:2012-09-03 08:26:12
【问题描述】:

我有一个类似 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,解析它并检查对象。

【问题讨论】:

  • 我正在使用它,对象被它模拟了......

标签: java mocking mockito


【解决方案1】:

您正在寻找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();

【讨论】:

  • 这太棒了!谢谢,这正是我想要的!
  • 我不知道为什么会这样,但是当要捕获的值是 JsonObject 时就不行
【解决方案2】:

还有另一种方法可以做到这一点,这里是示例:

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");

【讨论】:

    【解决方案3】:

    只是从@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());
    

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多