谷歌模拟已经宣布的方法

时间:2018-01-22 19:32:51

标签: c++ gmock

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

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

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

#include "gmock/gmock.h"

class HelloTest {
    void f();
};

MOCK_METHOD0(HelloTest::f, void(void));

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

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

error: ‘gmock0_HelloTest’ has not been declared

这个错误意味着什么,有没有办法做我想做的事?

1 个答案:

答案 0 :(得分:1)

首先,您的MOCK_METHOD0()声明必须属于模拟类under a public section。例如,您的代码段:

#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()更改为虚拟,因为您在HelloTest::f中使用MOCK_METHOD0要求f()为虚拟。< / p>

由于您不想使用虚拟功能,因此您唯一的另一个选择是使用Google Mock团队调用的hi-perf dependency injection。使用这种非虚拟方法,您必须创建一个不从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>()

相关问题