我正在使用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类的实例名称(不是我想通过的模拟对象!)根本没有重要性。
所以,我的问题是:
答案 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)
抱歉,我错了。只有显式模拟的实例才会变成模拟。其他人是真正的阶级的对象。我错了,因为真正的类中所有其他模拟的依赖项也是如此。
因此,如果我模拟一个类的实例,那么该类的所有其他实例都被实例化为模拟。他们是真正的阶级的对象。
感谢您的有用答案,我为错误道歉。