、私はA::request
が呼び出されたとき、B::response()
も同様に呼ばれていることを確認するために、ユニットテストclass A
にしたい:Google Test Framework:シャドーイングまたはバーチャルメソッドを使用する方が良いですか?以下の例では
class A
{
public:
void request()
{
m_b.response();
}
private:
B m_b;
};
class B
{
public:
void response();
};
それを行うためには、class B
を嘲笑する必要があります。
class MockB : public B
{
public:
MOCK_METHOD0(response, void());
};
テストが含まれるように:
class TestA : public A
{
...
};
...
EXPECT_CALL(m_b, response()).Times(1);
request();
...
質問I s:B m_b
の代わりにMockB
を「注入する」方法は?
まずtecnique: class MockB
へのメソッド呼び出しをリダイレクトするShadowB
クラスを作成します。これには、元のコードを外部バイナリに入れる必要がありますが、実際のコードを変更する必要はありません。
第tecnique:
B::response
virtual
- 作る
std::unique_ptr<B> m_b
- に
B m_b
の変更は、テストセットアップ
第二のアプローチのMEAの間class MockB
のインスタンスとm_b
値を置き換えますより多くのコードが変更され、そのプロについてはわかりません。
基本的に、テスト駆動型の設計手法を提案しています。非常に興味深いテンプレートテクニック。それは途中でコードに大きな影響を与えるでしょう(多くのコードをヘッダーとインラインファイルに移動する必要があります)。 – nyarlathotep108
はい、私はそれが宗教的にそれに従わないが、テスト駆動設計の多くの側面が非常に好きです。しかし、実装を書く前に起こる可能性のある小さなシナリオごとに単体テストを作成しなくても(TDDが教えてくれるように)、あなたはまだ後で考えてテストを追加することができますいくつかの深刻なコードの再設計 - あなたはそれから離れません、テストは邪魔です。個人的には私が書くすべてのものをテンプレート化したいので、Mockテンプレートパラメータを適用することができます – Smeeheey