当前位置: 首页 > 面试题库 >

如何验证非模拟对象的方法被调用?

司徒捷
2023-03-14
问题内容

似乎模拟仅验证模拟对象的方法是否被调用,并且模拟对象始终具有类似以下内容的东西 doReturn().when(mock object)

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

这是我想做的事情:我定义了一个模拟环境,无论发生什么情况都返回一个响应。但是然后我想验证在不同情况下调用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(...);
}

问题答案:

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

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


 类似资料:
  • 下面是我要为其创建测试的类和方法: 具体地说,我希望模拟getAnalytics.getAll(),这样它就会返回一个我已经定义的字符串。而不是方法执行它的任务。这是我的代码:

  • 我正在寻找一种方法来验证Mockito,在测试期间没有与给定的模拟进行任何交互。对于具有验证模式的给定方法,很容易实现这一点,但是我还没有找到完整模拟的解决方案。 我真正想要实现的是:在测试中验证,控制台上没有打印任何get。jUnit的总体思路如下: 一个有很多方法,我真的不想用单独的verify来验证每一个方法,对于。。。 所以我希望,如果有一个简单的解决方案,鉴于我有一个良好的测试覆盖率,我

  • 我有一个测试,如下所示,在给定条件下,我想确保。 然而,它错误地指出 错误出现在行 应为不是模拟对象。如何测试为非模拟对象调用的方法? 我在如何验证一个非模拟对象的方法中看到了答案?,但这仍然是使用模拟和间谍。我希望找到一种不需要嘲笑我已经拥有的类实例的方法。 (注:以上内容以科特林书写)

  • 我试图编写一个单元测试,它需要确认是否调用了一个方法。我使用的是JUnit、Mockito和PowerMock。 因此,在这里,我的测试系统是。我正在运行这个测试: 这个例子只是实际代码的一个例子.... 我想做的是不可能的吗?还是我走错路了? 谢谢大家:)

  • 现在有另一个类调用 为了对进行单元测试,我们使用了以下方法 我的问题是如何验证同伴方法是否被调用。

  • 如何模拟返回已强制转换的模拟对象的方法。 试验方法。