Mockito模拟是指被模拟类的所有对象吗?

时间:2017-11-28 11:01:34

标签: java unit-testing junit mocking mockito

我正在使用Mockito测试我的代码,我使用过:

RequestWrapper requestWrapper = mock(RequestWrapper.class);

我认为它会嘲笑RequestWrapper.class的 requestWrapper实例

相反,当在 系统中的 的代码中时,我调试了这个:

RequestWrapper a = new RequestWrapper(request);
RequestWrapper b = new RequestWrapper(request);
RequestWrapper c = new RequestWrapper(request);

我发现RequestWrapper的 a,b,c 实例都被模拟了。 所以似乎Mocked类的实例名称(不是我想通过的模拟对象!)根本没有重要性。

所以,我的问题是:

  • 如果在使用 Mockito.mock()的时候嘲笑一个类的实例(定义一个特定的实例名称)是什么意思,你会同时嘲笑同一个类的所有实例?
  • 另一个是,如果我想定义我的模拟实例的不同行为,我是否必须在测试中声明实例的正确名称,以便用 when()定义不同的行为。然后()

4 个答案:

答案 0 :(得分:2)

您对模拟的假设不正确。

当您的测试代码实例化新对象(new RequestWrapper())时,不使用Mockito.mock() 创建的模拟(除非您使用Powermock模拟构造函数,但这是另一个故事)。

答案 1 :(得分:2)

正如其他答案所述:你嘲笑错了。

关键是:你想要模拟一个类的“所有”实例。相反:您必须 创建模拟对象。模拟是卑鄙,以便更容易(或可能!)测试特定的代码片段。换句话说:模拟允许您控制在该段代码中使用的内容。

因此,对控制您的“受测试代码”将使用的一个特定对象感兴趣。

在单元测试的某个地方使用mock(X.class)@Mock X x时,绝对想要控制每个X类实例!

是的,当你有

X mock1 = mock(X.class);
X mock2 = mock(X.class);

然后,您需要单独的when().then()verify() 这两个对象的规范(如果mockito提供的默认行为不充分)。这也是我上面写的内容的结果:你应该绝对清楚“哪个”模拟“去哪里”。

答案 2 :(得分:1)

必须使用Mockito.mock()或使用@Mock注释独立创建在测试方法中使用的每个单独的RequestWrapper对象。

然后必须使用when().then()语法独立设置它们中的每一个。

如果在一个测试方法中使用同一类的许多模拟,那么mock(Class<T> classToMock, String name)在调试或断言失败日志记录方面会有所帮助。

答案 3 :(得分:0)

抱歉,我错了。只有显式模拟的实例才会变成模拟。其他人是真正的阶级的对象。我错了,因为真正的类中所有其他模拟的依赖项也是如此。

因此,如果我模拟一个类的实例,那么该类的所有其他实例都被实例化为模拟。他们是真正的阶级的对象。

感谢您的有用答案,我为错误道歉。

相关问题