接口vs C++中依赖注入的模板

Tob*_*olm 24 c++ unit-testing mocking

为了能够对我的C++代码进行单元测试,我通常会将测试类的构造函数传递给一个或多个对象,这些对象可以是"生产代码"或伪造/模拟对象(让我们调用这些注入对象).我这样做了

  1. 创建"生产代码"类和伪/模拟类继承的接口.
  2. 使测试中的类成为一个模板类,它将注入对象的类型作为模板参数,并将注入对象的实例作为构造函数的参数.

一些随意的想法:

  • 在我们有概念(C++ 0x)之前,只有文档和参数命名会暗示提供被测试类的内容(使用模板时).
  • 并不总是可以为遗留代码创建接口
  • 基本上只创建接口以便能够进行依赖注入
  • 以同样的方式:模拟被测试的类只是为了启用依赖注入

你的想法是什么?这个问题还有其他解决方案吗?

Pav*_*aev 8

使用C++,还有另一种选择 - 您可以为模拟类提供与实际类完全相同的名称,并且在链接单元测试时,只需将它们与模拟对象/库文件而不是实际文件链接.

  • 理论上是的.但我认为这在实践中并不好.例如,您希望在一次测试中模拟的类可以在另一个测试中进行测试.然后你需要为每个测试套件或类似的东西创建一个单独的项目(例如VS项目)...... (2认同)

Ole*_*lin 5

我认为接口选项更好,但是不必为了测试而创建通用基类。您可以从生产类继承模拟类,并覆盖必要的方法。您必须使这些方法成为虚拟方法,但这是诸如嘲笑之类的工具的工作方式,它们还使该过程实现了一点自动化。

  • 仅作记录,人们应该意识到使方法虚拟化存在问题(请参阅非虚拟接口(NVI)习惯用法) (4认同)