Google-Mock 一个已经声明的方法

Google-Mock an already declared method

本文关键字:声明 方法 一个 Google-Mock      更新时间:2023-10-16

>MOCK_METHOD的语法可以在类定义中使用:

class A {
MOCK_METHOD0(f, void(void));
};

是否可以模拟已经声明的方法?我想要的是做一些类似于:

#include "gmock/gmock.h"
class HelloTest {
void f();
};
MOCK_METHOD0(HelloTest::f, void(void));

这个想法是将类定义放在 hpp 文件中,然后将模拟放在 cpp 文件中。实际上,我的类定义及其方法的原型需要与构建链中的其他 cpp 文件相同,并且我不想使用虚函数。

不幸的是,当我尝试执行上面写的操作时,在包含MOCK_METHOD0的行上出现以下错误:

error: ‘gmock0_HelloTest’ has not been declared

这个错误是什么意思,有没有办法做我想做的事情?

首先,您的MOCK_METHOD0()声明必须属于public部分下的模拟类。例如,您的代码片段:

#include "gmock/gmock.h"
class HelloTest {
void f();
};
MOCK_METHOD0(HelloTest::f, void(void));

应该看起来像这样:

#include "gmock/gmock.h"
class HelloTest {
virtual void f();
};
class Mock_HelloTest : public HelloTest {
public:
MOCK_METHOD0(f, void(void));
};

现在,您会注意到我已将f()更改为虚拟,因为您在MOCK_METHOD0中使用HelloTest::f需要f()是虚拟的。

由于您不想使用虚函数,因此您唯一的其他选择是使用Google Mock团队所谓的hi-perf依赖项注入。使用这种非虚拟方法,您必须创建一个单独的模拟类,该类不会继承自HelloTest。您还需要模板化当前使用HelloTest的任何代码,以便在生产中的HelloTest和测试中的Mock_HelloTest之间切换。

例如,假设您有以下调用HelloTest::f()的函数:

void RunHelloTest() {
HelloTest HT;
HT.f();
}

您可以按如下方式设置代码片段:

#include "gmock/gmock.h"
class HelloTest {
void f(); // <- f is no longer virtual
};
class Mock_HelloTest { // <- Mock_HelloTest no longer inherits from HelloTest
public:
MOCK_METHOD0(f, void(void));
};

并修改RunHelloTest()以接受模板类型参数:

template <class HelloTestClass>
void RunHelloTest() {
HelloTestClass HT;
HT.f(); // <- will call HelloTest::f() or Mock_HelloTest::f()
}

通过此设置,您将在生产代码中调用RunHelloTest<HelloTest>(),并在测试代码中调用RunHelloTest<Mock_HelloTest>()