C++ で保護されたメソッドを単体テストするにはどうすればよいですか?
Java では、テスト対象のクラスと同じパッケージにテスト クラスを作成するか、テスト クラスで必要なメソッドを公開する匿名サブクラスを作成しますが、C++ ではこれらのメソッドのいずれも使用できません。
NUnit を使用してアンマネージ C++ クラスをテストしています。
C++ で保護されたメソッドを単体テストするにはどうすればよいですか?
Java では、テスト対象のクラスと同じパッケージにテスト クラスを作成するか、テスト クラスで必要なメソッドを公開する匿名サブクラスを作成しますが、C++ ではこれらのメソッドのいずれも使用できません。
NUnit を使用してアンマネージ C++ クラスをテストしています。
一般にアクセス可能なクラスの保護されたメソッドを意味すると仮定します。
テスト コードで、テスト対象のクラスの派生クラスを (直接、またはその派生クラスの 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);
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
フレンドクラスMyClass_UnitTestを宣言します。MyClassで。次に、MyClass内部に完全にアクセスできる単体テストプログラムの他の場所でMyClass_UnitTestを定義できますが、リリースアプリケーションに実装を提供する必要はありません。これがどのように行われるかの良い例については、CppUnitのドキュメントを参照してください。
公開されている、おそらく静的な「単体テスト」機能を検討してください。
醜いですが、マクロや友人などを使用して考えることができる代替手段よりも優れています。