【问题标题】:Why do we need to create the mock object?为什么我们需要创建模拟对象?
【发布时间】:2016-05-13 06:26:11
【问题描述】:

我是单元测试的新手,我的经理推荐了 Mockito。我正在探索这个工具,但有些困惑,例如:

  1. 为什么我们需要创建模拟对象,而我们可以创建任何类的真实对象。

  2. 为什么我们使用存根设置任何方法的行为,例如“when and then”条件,而开发人员设置方法的行为。

  3. 1234563

例如:

   TestingServices test = Mockito.mock(TestingServices.class);

   // define return value for method getUniqueId()

    System.out.println("unique id is "+test.getUniqueId());

    when(test.getUniqueId()).thenReturn(44); 

    assertEquals(test.getUniqueId(),44); 

在上面的代码中,sn-p assertEquals 总是会通过,无论开发者是否更改代码。

【问题讨论】:

  • 您的测试是一个不好的例子,因为它是单元测试它所模拟的东西。在一个真实的例子中,您将通过模拟 B 对 A 进行单元测试,以便隔离 A 的行为,反之亦然。然后你会有更高级别的集成测试来检查 A 和 B 在没有被模拟时仍然正确交互。
  • 嗨 Jonrsharpe,谢谢你给我 ans..实际上我关心的是为什么我们需要创建模拟对象和存根?请解释一下,您的帮助将消除我的疑虑。
  • 嗨,Exoddus,你能给我更多的例子,当我们创建模拟对象或不需要创建它时。
  • @MohdAbad 当您不想想要测试交互时,当您想要测试应用程序的单个单元时,您需要创建模拟/存根隔离.

标签: unit-testing testing mockito


【解决方案1】:

无论如何,首先要注意您要测试的内容。

在您的代码中,sn-p 似乎您正在测试类 TestingServices 并且您不应该模拟该类,因为它的行为是您正在测试的,而不是 Mockito 如何注入您的“假”方法响应。 实际上,在您的示例中,您正在测试 Mockito 注入您想要的行为,并按预期工作,仅此而已。

例如:您的 TestingServices 类内部有一个对象,该对象使用第三方 API 并获得响应(或 MVC 架构中控制器使用的 DAO 对象)。如果您正在对TestingServicesController 进行单元测试,您不想因为依赖而失败,您可以模拟系统的那部分。

Mocking 让您专注于被测类,而不是您正在测试的过程中所需的上下文或其他类,并抽象出其余的组件。

有很多问题在谈论这个:

【讨论】:

  • 所以当我们需要创建模拟对象时,请给我一些例子。
  • Mohd,我正在用您提供的代码回答您的问题。如果需要有关模拟的具体示例,您肯定会找到大量搜索“java 模拟示例”的示例:)
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2019-08-20
相关资源
最近更新 更多