如何进行单元测试在C ++中受保护的方法是什么?
在Java中,我想无论是在相同的封装测试类中创建测试类或创建一个匿名子类,暴露出我需要在我的测试类中的方法,但在C ++中没有这些方法都可以给我。
我正在测试使用NUnit非托管C ++类。
如何进行单元测试在C ++中受保护的方法是什么?
在Java中,我想无论是在相同的封装测试类中创建测试类或创建一个匿名子类,暴露出我需要在我的测试类中的方法,但在C ++中没有这些方法都可以给我。
我正在测试使用NUnit非托管C ++类。
假设你的意思是可公开访问类的保护方法:
在测试代码,定义一个派生类的类的被测(直接,或从它的派生类中的一个)。 添加存取受保护的成员,或执行派生类中的测试。 “受保护”的访问控制真的不是在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);
您还可以使用使用关键字来揭露公共块(使用。
// 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
声明友类MyClass_UnitTest; 在MyClass的。 然后,您可以定义MyClass_UnitTest在具有完全访问MyClass的内部单元测试程序的其它地方,但你不必提供你的发布应用程序的实现。 见CppUnit的文档中如何做到这一点的好例子。
我用CxxTest并有CxxTest从包含受保护的成员函数的类派生。 如果你还在四处寻找你最喜欢的C ++单元测试框架,来看看这篇文章 。
考虑公众可能静态“单元测试”功能。
丑陋,但比我能想到使用宏或朋友或这样的方案更好。
有一个在C ++一个简单的解决方案使用的#define。 只是包装的包括你的“ClassUnderTest”像这样的:
#define protected public
#define private public
#include <ClassUnderTest.hpp>
#undef protected
#undef private
幸得本文以及RonFox