我正在寻找C++编码风格的最佳实践,以确保简化单元测试。问题来自尝试为私有(private)数据成员实现模拟类。在类中可以通过几种不同的方法访问私有(private)数据成员。到目前为止,我能找到的所有示例都显示了如何编写模拟类,但没有如何最好地编写将同时使用真实对象和模拟对象的代码。

在下面的示例中,我不确定如何从类型MyOtherClass到我的模拟MockMyOtherClass获取mCustom。我怀疑我的方法是错误的,因此是问题。

class MyClass {
    MyOtherClass mCustom;
};

[编辑]
我使用了一个编译器指令,并添加了一个新的构造函数。
#ifdef UNIT_TESTING
 #include "mock.h"
#else
  #include "myotherclass.h"
#endif

class MyClass {
        MyOtherClass mCustom;
     public:
        MyClass(MyOtherClass pClass) : mCustom(pClass) {}
};

最佳答案

您可以使用几种不同的策略工具(并根据需要混合使用)。

  • 如果MyOtherClass提供了相当基本的功能并经过了充分的测试,那么我通常就不用去 mock 它。我只是确保在整个项目上运行单元测试时,先测试MyOtherClass,然后再测试MyClass。
    class MyClass {
    private:
        MyOtherClass mCustom;
    public:
        //...
    };
    
  • 您可以对MyClass进行模板化,在真实代码中提供MyOtherClass,并在测试代码中提供MyOtherClass的模拟版本。
    template <class T>
    class MyClass_impl {
    private:
        T mCustom;
    public:
        //...
    };
    
    typedef MyClass_impl<MyOtherClass> MyClass; // convenience typedef
    
  • 您可以将MyOtherClass拆分为一个接口(interface)类和一个实现类。 MyClass仅存储指向接口(interface)类的指针,并在实例化时获取对实现的引用。
    class MyClass {
    public:
        MyClass(MyOtherClass* aCustom) : mCustom(aCustom) {}
    private:
        MyOtherClass* mCustom;
    public:
        //...
    };
    
  • 您可以在标题的搜索路径中使用技巧。为此,您可以在单独的目录中创建MyOtherClass的模拟版本。然后,您确保对于单元测试,首先在此单独的目录中搜索头文件。这样可以首先找到MyOtherClass的模拟版本,并覆盖MyOtherClass的真实版本。
  • 09-10 04:36