我正在使用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().then()定义不同的行为?
编辑:更新
对不起,我错了。只有显式模拟的实例才会成为模拟。其他是真实类的对象。我错了,因为真实类中的所有其他模拟依赖项也是如此。
因此,如果我模拟一个类的实例,则该类的所有其他实例都实例化为模拟,这是不正确的。它们是真实类的对象。
感谢您的有用答案,对于错误,我深表歉意。
你对模拟的假设是不正确的。
当你被测试的代码实例化新对象(new RequestWrapper()
)时,不使用使用Mockito.mock()
创建的模拟(除非你使用例如Powermock模拟构造函数,但那是另一回事)。
正如其他答案所概述的那样:你嘲笑错了。
关键是:你不想模拟一个类的"所有"实例。相反:您只在必要时创建模拟对象。模拟是一种使测试特定代码段更容易(或可能!)的方法。换句话说:模拟允许您控制该代码段中使用的内容。
因此,您只对控制"待测试代码"将使用的一个特定对象感兴趣。
当你在单元测试的某个地方使用mock(X.class)
或@Mock X x
时,你绝对不想控制类 X 的每个实例!
是的,当你有
X mock1 = mock(X.class);
X mock2 = mock(X.class);
然后,您需要为这两个对象分别when().then()
或verify()
规范(以防 mockito 提供的默认行为不够)。这又是我上面写的结果:你应该绝对清楚"哪个"模拟"去哪里"。
必须使用Mockito.mock()
或使用@Mock
注释独立创建所测试方法中使用的每个单独的 RequestWrapper 对象。
然后,它们中的每一个都必须使用when().then()
语法独立设置。
如果您在一个测试方法中使用同一类的许多模拟,那么mock(Class<T> classToMock, String name)
在调试或断言失败日志记录方面会有所帮助。
对不起,我错了。只有显式模拟的实例才会成为模拟。其他是真实类的对象。我错了,因为真实类中的所有其他模拟依赖项也是如此。
因此,如果我模拟一个类的实例,则该类的所有其他实例都实例化为模拟,这是不正确的。它们是真实类的对象。
感谢您的有用答案,对于错误,我深表歉意。