Google Test をいじっていたときに、ちょっとした難問にぶつかりました。
外部システムからのイベントに基づいて、システム内を行き来するエンティティと対話する新しいクラスを生成する C++ クラスを単体テストしたいと考えています。イベント ディスパッチャと特殊なエンティティのクラスの作成方法はすべて、私が制御または変更できないライブラリによって決定されます。ライブラリの設計では、エンティティへの接続方法に関する特定のパラメーターをクラス コンストラクターに渡す必要があり、そのエンティティーが存在しない場合、コンストラクターはスローします。これらのクラスは、その存在とイベントに応じて使用されるため、メソッドを使用できるようにしたいと考えてEXPECT_CALL()
います。これには明らかに、実際のクラスではなくモッククラスをモックまたはオーバーロードして返すことができるファクトリが必要です。
既にイベント モニターを IClass に抽象化して、そのモックを作成し、制御された方法でイベントをフィードできるようにしました。一連の Construct[x] メソッドを持つファクトリを作成しました。各メソッドはstd::shared_ptr
、特定の IClass の新しいインスタンスの を返します。これは問題なく動作し、この方法でテストしたいクラスで完全なテスト スイートを実行できます。適切なクラス破壊を含みます。
ただし、工場をより一般的なものにしたいと考えており、思いつくのは次のとおりです。
class ClassFactory {
public:
template<class U, class... Args>
std::shared_ptr<U> Construct(Args&&... args) {
return std::make_shared<U>(std::forward<Args>((args)...));
}
};
クラスファクトリを使用するテストしたいクラスは、テストクラスのコンパイル時にすでにオブジェクトファイルにコンパイルされているため、上記のテンプレート化されたファクトリは明らかに機能しません。テンプレートは既に評価されており、テスト クラスでのテンプレートの特殊化の形式は、テストしたいクラスからの Construct 呼び出しを再ルーティングしません。
したがって、私の質問は次のとおりです。このための汎用ファクトリを作成することはまったく可能ですか? もしそうなら、どうすればいいですか?
助けてくれてありがとう!