嘲笑嘲笑是指被嘲笑类的所有对象?



我正在使用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)在调试或断言失败日志记录方面会有所帮助。

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

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

感谢您的有用答案,对于错误,我深表歉意。

相关内容

  • 没有找到相关文章

最新更新