21

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

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

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

4

6 回答 6

28

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

在测试代​​码中,定义被测类的派生类(直接或从其派生类之一)。为受保护的成员添加访问器,或在派生类中执行测试。“受保护的”访问控制在 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);
于 2009-07-14T23:49:58.570 回答
15

您还可以使用 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

于 2015-07-21T15:59:59.293 回答
2

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

于 2009-07-14T23:53:44.773 回答
1

声明一个朋友类 MyClass_UnitTest;在你的 MyClass 中。然后,您可以在单元测试程序中的其他地方定义 MyClass_UnitTest,它可以完全访问 MyClass 内部,但您不必在发布应用程序中提供实现。请参阅CppUnit文档以了解如何完成此操作的一个很好的示例。

于 2009-07-14T20:36:37.587 回答
0

C++ 中有一个使用#define 的简单解决方案。只需像这样包装您的“ClassUnderTest”的包含:

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

归功于这篇文章和 RonFox

于 2015-12-16T17:43:55.097 回答
-1

考虑一个公共的、可能是静态的“单元测试”功能。

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

于 2009-07-14T20:11:50.133 回答