class IA
{
public:
IA() {}
virtual ~IA() {}
virtual void function_1() = 0;
};
// A mock class of actual class 'A'
class A : public IA
{
public:
A() {}
~A() {}
MOCK_METHOD0(function_1, void());
};
class B
{
public:
B() {}
~B() {}
void run(int num_run)
{
for (int i = 0; i < num_run; i++)
{
A a();
a.function_1();
}
}
};
TEST()
{
// how to test b.run will actual call A::function_1() for 5 times?
B b();
b.run(5);
}
基于上面的代码,我想测试类B的行为。类B使用类A,在这种情况下,我有一个模拟的类A。由于谷歌测试EXPECT_CALL((需要实际的对象来调用函数,因此EXPECT_CAL((在这里不起作用。这是因为在调用b.run((之前,模拟的"A"对象尚未创建,并且由于它在b.run范围内,因此无法获取其对象,之后它将立即被销毁。在这种情况下,有什么可以测试的行为吗?如何测试mock"A"被创建了5次,以及如何测试A.function_1((被调用了5次。
您必须使用某种形式的依赖项注入。有多种方法可以做到这一点:
- 使用函数参数
- 使用模板
- 使用虚拟工厂功能
使用模板的示例:
class B
{
...
template <class T>
void run(int num_run)
{
for (int i = 0; i < num_run; ++i)
{
T a();
a.function_1();
}
}
};
现在,您可以在测试中使用T
的mock。
此外,类IA
不再需要具有用于此测试的虚拟函数,除非其他代码需要这些虚拟函数。
有关详细信息,请参阅Google Mock文档。