如何在C ++中对受保护的方法进行单元测试?
在Java中,我要么在与测试中的类相同的包中创建测试类,要么创建一个匿名子类,在我的测试类中公开我需要的方法,但在C ++中我都无法使用这些方法
我正在使用NUnit测试一个非托管的C ++类。
答案 0 :(得分:23)
假设您指的是可公开访问的类的受保护方法:
在测试代码中,定义被测试类的派生类(直接或从其派生类之一)。为受保护的成员添加访问者,或在派生类中执行测试。 “受保护的”访问控制在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);
答案 1 :(得分:6)
您还可以使用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
答案 2 :(得分:2)
声明一个朋友类MyClass_UnitTest;在你的MyClass中。然后,您可以在单元测试程序中的其他位置定义MyClass_UnitTest,该程序具有对MyClass内部的完全访问权限,但您不必在发布应用程序中提供实现。 有关如何完成此操作的一个很好的示例,请参阅CppUnit文档。
答案 3 :(得分:2)
我使用CxxTest并从包含受保护成员函数的类派生CxxTest。如果您仍在寻找自己喜欢的C ++单元测试框架,请查看this article。
答案 4 :(得分:0)
考虑一个公共的,可能是静态的“单元测试”功能。
丑陋,但比我能想到的使用宏或朋友等的替代品更好。
答案 5 :(得分:0)
使用#define在C ++中有一个简单的解决方案。只需包装你的“ClassUnderTest”包括:
#define protected public
#define private public
#include <ClassUnderTest.hpp>
#undef protected
#undef private