を使用するコードを開発していますboost::asio
。テストするには、このライブラリから一連のクラスをモックする必要があります。仮想メソッドをモックできる Google Mock を使用しています。通常の (そして面倒な) プロセスは、使用する必要があるクラスごとにインターフェイスを作成することです。
一方、Google Mock Cookbook では、非仮想メソッドをモックする場合の代替手段として、テンプレートの使用について説明しています。私の場合の問題は、同時に複数のクラスをモックする必要がある可能性があることです (そのため、テンプレートを直接使用しても機能しません)。だから私は考えました: 2 レベルのテンプレートを使用しないのはなぜですか? 私は次の解決策を思いつきました:
// Classes to be mocked.
class RealA
{
public:
void a() { cout << "RealA::a()" << endl; };
};
class RealB
{
public:
void b() { cout << "RealB::b()" << endl; };
};
// Mock classes.
class MockA
{
public:
void a() { cout << "MockA::a()" << endl; };
};
class MockB
{
public:
void b() { cout << "MockB::b()" << endl; };
};
template<class ABFactory>
class Program
{
public:
void setFactory(ABFactory* factory) { factory = factory; }
void useA() { typename ABFactory::A* a = factory->createA(); a->a(); delete a; }
void useB() { typename ABFactory::B b; b.b(); }
private:
ABFactory* factory;
};
template<class ParamA, class ParamB>
class TABFactory
{
public:
typedef ParamA A;
typedef ParamB B;
A* createA() { return new A; };
B* createB() { return new B; };
};
typedef TABFactory<RealA, RealB> RealABFactory;
typedef TABFactory<MockA, MockB> MockABFactory;
次に、通常の使用法は次のようになります。
Program<RealABFactory> p;
p.useA();
p.useB();
テストは次のようになりますが:
Program<MockABFactory> t;
t.useA();
t.useB();
これは、モック化されたクラスに複雑なパラメーターを持つメソッド (モック化されていない可能性のある同じライブラリの他のクラスなど) がある場合に複雑になります。要約すると、スケールしないようです。この解決策についての考え、または問題への他のアプローチに関する提案はありますか?