Как выполнить модульное тестирование защищенного метода в C ++? - PullRequest
16 голосов
/ 14 июля 2009

Как выполнить модульное тестирование защищенного метода в C ++?

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

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

Ответы [ 6 ]

23 голосов
/ 15 июля 2009

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

В тестовом коде определите производный класс тестируемого класса (либо напрямую, либо из одного из его производных классов). Добавьте средства доступа для защищенных членов или выполните тесты в своем производном классе. «Защищенный» контроль доступа на самом деле не очень страшен в 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);
8 голосов
/ 21 июля 2015

Вы можете также использовать ключевое слово, чтобы выставить открытый блок (используя.

// 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 голосов
/ 15 июля 2009

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

2 голосов
/ 15 июля 2009

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

0 голосов
/ 16 декабря 2015

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

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

Кредит переходит к этой статье и RonFox

0 голосов
/ 15 июля 2009

Рассмотрим общедоступную, возможно, статическую функцию «модульного теста».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...