gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:05:24 24 4
gpt4 key购买 nike

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 文件中。实际上,我的类定义及其方法原型(prototype)需要与我的构建链中的其他 cpp 文件相同,我不想使用虚函数。

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

error: ‘gmock0_HelloTest’ has not been declared

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

最佳答案

首先,您的 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::fMOCK_METHOD0需要 f()成为虚拟的。

由于您不想使用虚函数,您唯一的其他选择是使用 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>()在你的测试代码中。

关于c++ - Google-Mock 一个已经声明的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48388974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com