如何使用谷歌测试模拟和测试动态创建的对象


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文档。

最新更新