Google-Mock 一个已经声明的方法
Google-Mock an already declared method
>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>()
。
相关文章:
- 声明高维向量的更简洁的方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 将子类方法声明为基类的友元
- 如何在声明为 const 的方法中更改类成员
- 编译器无法识别在类声明之外定义的方法
- 在类中声明 Array 成员的正确方法
- 如何在该接收类之外声明嵌套类的方法
- 转发声明在命名空间中不起作用的替代方法
- 在实现文件中使用模板参数声明方法
- 为什么在主方法之前声明方法会产生错误 c++
- 在 cpp 正文中声明方法时未定义的符号
- 声明方法时没有名称空间,也没有对C 作用的方法的对象
- 无法在类中声明方法 (C++_
- 可变声明方法
- 为什么这种前向声明方法会产生错误
- 在c++中可以通过模板声明方法吗?
- 在c++中声明方法时= 0的含义是什么?
- 为什么我需要为部分模板专门化重新声明方法/成员?
- 两种数组声明方法的区别
- 强制编译器声明方法是否已被实现- c++