21

C++ で保護されたメソッドを単体テストするにはどうすればよいですか?

Java では、テスト対象のクラスと同じパッケージにテスト クラスを作成するか、テスト クラスで必要なメソッドを公開する匿名サブクラスを作成しますが、C++ ではこれらのメソッドのいずれも使用できません。

NUnit を使用してアンマネージ C++ クラスをテストしています。

4

6 に答える 6

28

一般にアクセス可能なクラスの保護されたメソッドを意味すると仮定します。

テスト コードで、テスト対象のクラスの派生クラスを (直接、またはその派生クラスの 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);
于 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内部に完全にアクセスできる単体テストプログラムの他の場所でMyClass_UnitTestを定義できますが、リリースアプリケーションに実装を提供する必要はありません。これがどのように行われるかの良い例については、CppUnitのドキュメントを参照してください。

于 2009-07-14T20:36:37.587 に答える
-1

公開されている、おそらく静的な「単体テスト」機能を検討してください。

醜いですが、マクロや友人などを使用して考えることができる代替手段よりも優れています。

于 2009-07-14T20:11:50.133 に答える