我正在开发使用boost::asio
. 为了测试它,我需要从这个库中模拟一组类。我正在使用 Google Mock,它允许模拟虚拟方法。通常(且乏味)的过程是为我需要使用的每个类编写一个接口。
另一方面,Google Mock Cookbook 描述了模拟非虚拟方法的另一种方法:使用模板。我的问题是我可能需要同时模拟几个类(所以直接使用模板是行不通的)。于是我想:为什么不用两级模板呢?我想出了以下解决方案:
// 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();
当被模拟的类具有带有复杂参数的方法(例如来自同一库的其他类可能未被模拟)时,这开始变得复杂。总而言之,它似乎没有规模化。对这个解决方案有什么想法,或者对解决问题的其他方法有什么建议吗?