Как unit test защищенный метод на С++?

Как unit test защищенный метод на С++?

В Java я либо создавал бы тестовый класс в том же пакете, что и тестируемый класс, либо создавал анонимный подкласс, который предоставляет метод, который мне нужен в моем тестовом классе, но ни один из этих методов не доступен мне в С++.

Я тестирую неуправляемый класс С++ с помощью NUnit.

Ответ 1

Предполагая, что вы имеете в виду защищенный метод общедоступного класса:

В тестовом коде определите производный класс тестируемого класса (либо непосредственно, либо из одного из его производных классов). Добавьте аксессоров для защищенных членов или выполните тесты в производном классе. "Защищенный" контроль доступа на самом деле не очень страшен в С++: он не требует сотрудничества от базового класса, чтобы "взломать" его. Поэтому лучше не вводить никакого "тестового кода" в базовый класс, даже не объявление друга:

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

Ответ 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

Ответ 3

Объявить класс друга MyClass_UnitTest; в вашем MyClass. Затем вы можете определить MyClass_UnitTest в другом месте в вашей программе unit test, которая имеет полный доступ к внутренним компонентам MyClass, но вам не нужно предоставлять реализацию в своем выпуске. См. CppUnit для хорошего примера того, как это делается.

Ответ 4

Я использую CxxTest и получаю CxxTest из класса, который содержит защищенную функцию-член. Если вы все еще ищете свою любимую платформу С++ Unit Testing, взгляните на эту статью.

Ответ 5

Рассмотрим публичную, возможно статическую функцию unit test.

Уродливый, но лучше, чем альтернативы, я могу придумать использование макросов или друзей или таких.

Ответ 6

В С++ есть простое решение, использующее #define. Просто оберните включение своего "ClassUnderTest" следующим образом:

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

Кредит относится к этой статье и RonFox