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

Ale*_*x B 16 c++ nunit unit-testing protected

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

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

我正在使用NUnit测试一个非托管的C++类.

Ste*_*sop 24

假设您的意思是可公开访问的类的受保护方法:

在测试代​​码中,定义被测试类的派生类(直接或从其派生类之一).为受保护的成员添加访问者,或在派生类中执行测试."受保护的"访问控制在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);
Run Code Online (Sandbox Code Playgroud)


小智 12

您还可以使用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);
Run Code Online (Sandbox Code Playgroud)

请参阅:http://en.cppreference.com/w/cpp/language/using_declaration