![](/img/trans.png)
[英]Mocked objects turns null in service calls. They are available as mocked object in Test class but when reaches service class there all mocks' are null
[英]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 !)根本不重要。
所以,我的问题是:
对不起,我错了。 只有显式模拟的实例才会成为模拟。 其他是真实类的对象。 由于真实类中的所有其他模拟依赖项,我也出错了。
因此,如果我模拟一个类的实例,则该类的所有其他实例都被实例化为模拟,这是不正确的。 它们是真正的类的对象。
感谢您提供有用的答案,我为错误道歉。
你对模拟的假设是不正确的。
当您的测试代码实例化新对象( 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.