【问题标题】:How to generate a mocked object that is created within the class being tested?如何生成在被测试类中创建的模拟对象?
【发布时间】:2015-09-17 21:28:31
【问题描述】:

我有一个测试类,它实例化了一个我希望被模拟的类。这可能在 gmock 框架内吗?根据我的阅读,似乎必须创建模拟对象并将其传递给正在测试的对象,这不是我想要的。

我已经得到它,以便我可以将我的模拟类注入源代码,但我不知道如何让它生成适当的对象。

【问题讨论】:

  • 你能解释一下这个问题背后的原因吗?我试图理解你为什么要模拟返回对象......基本上答案很简单你不能模拟对象,但我们都在这里学习和互相帮助......
  • 如果我想模拟一个类,那么我希望使用我的类,即使它是在我正在测试的类中生成的。假设它是一个临时对象,已生成、使用和销毁。有时在同一功能内,有时不在。有时会在课堂外发布,有时不会。
  • 只有当它对外部资源等进行复杂的操作/影响时,你才应该模拟对象......如果你的情况与我提到的情况之一匹配,那么你可能违反SRP(如果所以,你应该重构代码)。如果对象是PoD 对象,则根本不应该模拟它,而是可以在方法结束时验证对象的状态...
  • @OldFox,我只是在开发用于向遗留应用程序添加测试的框架。我主要关心的是能够替换现有的类定义,因为这是一个不需要虚拟化依赖类接口的遗留应用程序。在这个后期(20 多年后)切换它需要太多时间。由于类型不一致,它是否应该完成是次要的。但是,感谢您的信息。我会调查你说的信息。谢谢。

标签: c++ unit-testing gmock


【解决方案1】:

答案是将EXPECT_CALL()放入构造函数中,使用*this作为第一个参数。当然,这只有在您希望它始终保持不变时才有效。

如果预期行为因实例而异,这将变得更加复杂,除非每个实例使用不同的构造函数。

如果使用相同的构造函数,那么您的模拟类可以使用静态计数器,该计数器可以根据实例计数改变预期值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2023-03-23
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多