如何进行单元测试在C ++中受保护的方法是什么?(How do I unit test a prot

2019-07-30 04:19发布

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

在Java中,我想无论是在相同的封装测试类中创建测试类或创建一个匿名子类,暴露出我需要在我的测试类中的方法,但在C ++中没有这些方法都可以给我。

我正在测试使用NUnit非托管C ++类。

Answer 1:

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

在测试代​​码,定义一个派生类的类的被测(直接,或从它的派生类中的一个)。 添加存取受保护的成员,或执行派生类中的测试。 “受保护”的访问控制真的不是在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);


Answer 2:

您还可以使用使用关键字来揭露公共块(使用。

// 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



Answer 3:

声明友类MyClass_UnitTest; 在MyClass的。 然后,您可以定义MyClass_UnitTest在具有完全访问MyClass的内部单元测试程序的其它地方,但你不必提供你的发布应用程序的实现。 见CppUnit的文档中如何做到这一点的好例子。



Answer 4:

我用CxxTest并有CxxTest从包含受保护的成员函数的类派生。 如果你还在四处寻找你最喜欢的C ++单元测试框架,来看看这篇文章 。



Answer 5:

考虑公众可能静态“单元测试”功能。

丑陋,但比我能想到使用宏或朋友或这样的方案更好。



Answer 6:

有一个在C ++一个简单的解决方案使用的#define。 只是包装的包括你的“ClassUnderTest”像这样的:

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

幸得本文以及RonFox



文章来源: How do I unit test a protected method in C++?