【问题标题】:how to verify a method of a non-mock object is called?如何验证调用了非模拟对象的方法?
【发布时间】:2020-04-30 06:26:59
【问题描述】:

mockito 似乎只验证是否调用了 mock 对象的方法,并且 mock 对象总是有类似 doReturn().when(mock object) 的东西

但是我可以创建一个模拟对象并定义doReturn().when(mock object) 然后验证另一个对象的方法是否被调用?

这是我想要做的:我定义了一个 mockEnvironment 并且无论发生什么都返回一个响应。但是接下来我想验证一下在不同情况下调用 anotherObj 的不同方法。

怎么做?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    您可以为此使用 Mockito Spy。如果您将anotherObj 设置为间谍,您可以验证对该对象的方法调用。在您的示例中,您需要确保对foo 的调用使用间谍而不是anotherObj 的普通实现。间谍是这样设置的:

    AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
    // do stuff -- e.g. anotherObjSpy.foo(...);
    verify(anotherObjSpy).codePath1(...);
    

    【讨论】:

    • 这意味着如果我想验证多个事物,我可能需要创建和注入多个模拟对象?这不方便。
    • @user389955 是的,您需要将要检查的每个对象设置为间谍。据我所知,没有办法解决。 Mockito 需要为对象添加代理,并且必须有人告诉 Mockito 代理哪些对象。
    • 与其说“//do stuff”,补充一下“anotherObjSpy”可能会有所帮助,它必须使方法调用被测试。
    • 感谢@jwehrle,您需要在调用中使用anotherObjSpy,否则测试将无法进行。
    • 我有一个最终方法,我不能调用 spy on
    【解决方案2】:

    @Spy 注释非模拟对象,然后检查verify()。检查this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2016-06-08
      相关资源
      最近更新 更多