用C++实现模拟

for*_*neo 6 c++ testing tdd mocking

我需要一个类的模拟实现 - 用于测试目的 - 我想知道我应该如何做到这一点.我可以想到两种一般方式:

  1. 创建一个包含该类的所有公共函数的接口作为纯虚函数,然后通过派生它来创建一个模拟类.
  2. 将所有函数(至少是所有要模拟的函数)标记为虚拟.

我习惯于在Java中使用它的第一种方式,它也很常见(可能因为它们有专用的接口类型).但是我几乎没有在C++中看到这种界面沉重的设计,因此我很想知道.

第二种方式可能会起作用,但我不禁想到它有点难看.有人这样做吗?

如果我按照第一种方式,我需要一些命名帮助.我有一个音频系统,负责加载声音文件和播放加载的曲目.我正在使用OpenAL,因此我将接口称为"音频"和实现"OpenALAudio".但是,这意味着所有特定于OpenAL的代码都必须进入该类,这感觉有点限制.另一种方法是保留类"名称"Audio"并为界面找到不同的名称,例如"AudioInterface"或"IAudio".你会建议哪个,为什么?

Sin*_*hot 4

正如我不会在 Java 中手动编写模拟对象一样,我也不会在 C++ 中手动编写它们。模拟对象不仅仅是存根类,而且是执行自动检查的测试工具,例如确保调用某些方法,或者按顺序调用它们等。我会看看 C++ 的各种模拟对象框架。googlemock看起来很有趣,但还有其他的。

关于如何从实现中抽象出控制音频资源的概念,我绝对赞成使用具有通用名称(例如)的C++“接口”(纯虚拟基类)Audio和一个以其特殊之处命名的实现类(例如OpenALAudio) 。我建议您不要将“interface”或“I”一词嵌入您的类名中。将类型或编程概念嵌入到名称中已经不再流行多年(例如,当您将“接口”提升为成熟的“类”时,可能会强制进行广泛的重命名)。

接口开发是一个面向对象的概念,因此适合 C++。一些专门针对 C++ 的最重要的设计书籍都是关于接口编程(在 C++ 术语中意味着使用纯虚拟基类进行编程)。例如,设计模式大型 C++ 软件设计