How do I unit test a protected method in C++?

后端 未结 6 1669
遇见更好的自我
遇见更好的自我 2020-12-28 16:57

How do I unit test a protected method in C++?

In Java, I\'d either create the test class in the same package as the class under test or create an anonymous subcla

相关标签:
6条回答
  • 2020-12-28 17:32

    Assuming you mean a protected method of a publicly-accessible class:

    In the test code, define a derived class of the class under test (either directly, or from one of its derived classes). Add accessors for the protected members, or perform tests within your derived class . "protected" access control really isn't very scary in C++: it requires no co-operation from the base class to "crack into" it. So it's best not to introduce any "test code" into the base class, not even a friend declaration:

    // 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);
    
    0 讨论(0)
  • 2020-12-28 17:32

    You can also use using keyword to expose public block (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);
    

    See: http://en.cppreference.com/w/cpp/language/using_declaration

    0 讨论(0)
  • 2020-12-28 17:34

    There's a simple solution in C++ using #define. Just wrap the include of your "ClassUnderTest" like this:

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

    Credit goes to this article and RonFox

    0 讨论(0)
  • 2020-12-28 17:36

    Declare a friend class MyClass_UnitTest; in your MyClass. You can then define MyClass_UnitTest elsewhere in your unit test program that has full access to MyClass internals, but you don't have to provide an implementation in your release application. See CppUnit documentation for a good example of how this is done.

    0 讨论(0)
  • 2020-12-28 17:42

    Consider a public, possibly static 'unit test' function.

    Ugly, but better than the alternatives I can think of using macros or friends or such.

    0 讨论(0)
  • 2020-12-28 17:45

    I use CxxTest and have the CxxTest derive from the class that contains the protected member function. If you're still searching around for your favorite C++ Unit Testing framework, take a look at this article.

    0 讨论(0)
提交回复
热议问题