代码之家  ›  专栏  ›  技术社区  ›  Alex B

如何在C++中对受保护的方法进行单元测试?

  •  16
  • Alex B  · 技术社区  · 15 年前

    如何在C++中对受保护的方法进行单元测试?

    在爪哇中,我要么在与测试类相同的包中创建测试类,要么创建一个匿名子类,公开我在测试类中需要的方法,但是这些方法在C++中都不适用。

    我正在使用NUnt测试一个非托管C++类。

    6 回复  |  直到 15 年前
        1
  •  20
  •   Steve Jessop    15 年前

    假设您是指公共可访问类的受保护方法:

    在测试代码中,定义被测试类的派生类(直接或从其派生类之一)。为受保护成员添加访问器,或在派生类中执行测试。“受保护的“访问控制”在C++中并不十分可怕:它不需要与基类的合作来“破解”它。所以最好不要在基类中引入任何“测试代码”,甚至是友元声明:

    // in realclass.h
    class RealClass {
        protected:
        int foo(int a) { return a+1; }
    };
    
    // in test code
    #include "realclass.h"
    class Test : public RealClass {
        public:
        int wrapfoo(int a) { return foo(a); }
        void testfoo(int input, int expected) {
            assert(foo(input) == expected);
        }
    };
    
    Test blah;
    assert(blah.wrapfoo(1) == 2);
    blah.testfoo(E_TO_THE_I_PI, 0);
    
        2
  •  6
  •   KrisTC    9 年前

    还可以使用using关键字公开公共块(使用。

    // in realclass.h
    class RealClass {
        protected:
        int foo(int a) { return a+1; }
        int foo(string a) { return a.length(); } // Overload works too
        template<class T> int foo(const T& a) { return 1; } // Templates work too
    };
    
    // in test code
    #include "realclass.h"
    class RealClassExposed : public RealClass {
        public:
            using RealClass::foo;
    };
    
    RealClassExposed blah;
    assert(blah.foo(1) == 2);
    assert(blah.foo("test") == 4);
    assert(blah.foo(blah) == 1);
    

    见: http://en.cppreference.com/w/cpp/language/using_declaration

        3
  •  2
  •   Rob K    15 年前

    在MyClass中声明友元类MyClass_UnitTest;。然后,您可以在单元测试程序的其他地方定义MyClass_UnitTest,该程序可以完全访问MyClass内部,但不必在发布应用程序中提供实现。 见 CppUnit 记录如何完成的一个很好的例子。

        4
  •  2
  •   Pete    15 年前

    我用 CxxTest 并让cxtest从包含受保护成员函数的类派生。如果您还在搜索您最喜欢的C++单元测试框架,请看 this article .

        5
  •  0
  •   Will    15 年前

    考虑一个公共的,可能是静态的“单元测试”函数。

    丑陋,但比我能想到的使用宏或朋友等替代品更好。

        6
  •  0
  •   Langley    9 年前

    在C++中使用一个简单的定义来解决问题。只需将“ClassUnderest”的内容包装如下:

    #define protected public
     #define private   public
        #include <ClassUnderTest.hpp>
     #undef protected
    #undef private
    

    Credit goes to this article and RonFox