【问题标题】:Mockito mocks refers to all object of the mocked class?Mockito 模拟是指模拟类的所有对象?
【发布时间】:2017-11-28 11:01:33
【问题描述】:

我正在使用 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() 定义不同的行为。那么()?

编辑:更新

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

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

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

【问题讨论】:

  • 我注意到你的问题仍然是“开放的”——因为你没有接受答案。请查看并决定是否要accept 回答。或者让我知道我是否可以做些什么来增强我的输入以使其被接受。接受有助于未来的读者确定问题是否已解决,并对花时间回答你的人表示感谢。谢谢!

标签: java unit-testing junit mocking mockito


【解决方案1】:

您对模拟的假设不正确。

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

【讨论】:

    【解决方案2】:

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

    重点是:您确实想要模拟一个类的“所有”实例。相反:您在必要时创建模拟对象。模拟是一种意思,可以更容易(或可能!)测试一段特定的代码。换句话说:模拟允许您控制在那段代码中使用的东西。

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

    当您在单元测试的某处使用mock(X.class)@Mock X x 时,您绝对想要控制X 类的每个实例!

    是的,当你有的时候

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-20
          • 1970-01-01
          • 2017-08-21
          • 2013-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多