繁体   English   中英

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

[英]Mockito mocks refers to all object of the mocked class?

我正在用 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 类的实例名称(不是我想出来的模拟 Object !)根本不重要。

所以,我的问题是:

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

编辑:更新

对不起,我错了。 只有显式模拟的实例才会成为模拟。 其他是真实类的对象。 由于真实类中的所有其他模拟依赖项,我也出错了。

因此,如果我模拟一个类的实例,则该类的所有其他实例都被实例化为模拟,这是不正确的。 它们是真正的类的对象。

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

你对模拟的假设是不正确的。

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

正如其他答案所概述的那样:你嘲笑错了。

问题的关键是:你不想嘲笑一类的“所有”实例。 相反:您在必要时创建模拟对象。 有模拟的是一个意思,使其更容易(或可能的!)来测试特定的代码块。 换句话说:模拟允许您控制该代码段中使用的某些内容。

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

你绝对不想当您使用来控制每类X的任何实例mock(X.class)@Mock X x某处你的单元测试!

是的,当你有

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

那么您需要为这两个对象分别指定when().then()verify()规范(以防 mockito 提供的默认行为不够用)。 这又是我上面写的结果:你应该完全清楚“哪个”模拟“去哪里”。

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

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

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

对不起,我错了。 只有显式模拟的实例才会成为模拟。 其他是真实类的对象。 由于真实类中的所有其他模拟依赖项,我也出错了。

因此,如果我模拟一个类的实例,则该类的所有其他实例都被实例化为模拟,这是不正确的。 它们是真正的类的对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM