如何使用Google mock用虚拟和非虚拟方法模拟一个类
How to mock a class with both virtual and non-virtual methods using Google Mock?
我有一个类,我希望使用谷歌模拟模拟。我的类有非虚拟和虚拟方法。我已经通读了《谷歌模拟傻瓜》和《谷歌模拟食谱》。这些参考资料提供的示例和解释提到的类要么具有全部虚函数,要么没有虚函数,但没有一个类同时具有两者。所以我有两个问题:
(1)是否有可能模拟一个混合虚拟/非虚拟类型的类?
(2)应该使用什么方法(如果问题1为真)来模拟这个类?(如果问题1是假的)可以用什么代替?
一段代码,如果它有帮助:
class Time_Device : public Time_Device_Interface
{
private:
...
bool read32_irig_data( uint32_t *data_read, uint32_t reg_address);
bool thread_monitor_irig_changed( irig_callback_t callback );
public:
...
virtual bool set_time( struct time_sample const &time );
virtual bool get_time( struct time_sample *time );
virtual bool register_is_connected_notification(
irig_callback_t callback );
};
小背景:
我正在尝试使用Google Mock和Google Test,因为我需要在我的许多方法中模拟硬件返回,以便测试覆盖率等。我已经能够成功地单独使用Google Test来测试我的一些方法,而不嘲弄它们。
我正在使用Visual Studio 2010, CMake开发
我是Google Test和Google Mock的新手
我不能更改生产代码
(1)是否有可能模拟一个混合虚拟/非虚拟类型的类?
是的,但是你要小心。在模拟类中,只重写虚方法。
模拟应该是这样的:
struct Time_Device_Mock : public Time_Device_Interface
{
MOCK_CONST_METHOD1( set_time, bool(time_sample const &) );
MOCK_CONST_METHOD1( get_time, bool(time_sample *) );
MOCK_CONST_METHOD1( register_is_connected_notification, bool(irig_callback_t) );
};
(2)应该用什么方法来模拟这个类(如果问题1为真),(如果问题1为假)可以用什么代替?
这个问题有点奇怪。您说非虚拟方法是私有的,因此您不能访问它们。这就只剩下使用虚方法的选项了。
这意味着,创建一个模拟类的实例,并将其传递给应该使用它的对象。这种方法叫做依赖注入,注入依赖有几种方法。
相关文章:
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 覆盖作为另一个类的好友的虚拟受保护方法
- 重写另一个类中的虚拟方法以在 C++ 中访问其成员
- 如果一个类继承了一个带有虚拟 dtor 的类,为什么要删除一个没有虚拟 dtor 的类是可以的
- 为什么在std::optional的某些实现中有一个虚拟工会成员?
- 创建一个允许轻松创建虚拟函数包装器函数的C++宏
- C :基类调用自己的虚拟函数 - 一个反图案
- 有什么理由在没有继承的情况下声明一个虚拟方法
- 虚拟继承的性能开销(如果只有一个基具有数据成员)
- 如何使用一个 VirtualFree 调用删除多个相邻的虚拟内存分配?
- 是否可以在另一个方法中使用模板类中定义的虚拟方法
- 我们如何有证据表明,声明虚拟函数的类是2个字节,其中一个不超过一个未声明,而在子类中
- C 是纯虚拟函数,也是一个定义或仅声明
- 专用纯虚拟模板函数(未定义引用)的另一个问题
- 在c++中选择两个纯虚拟函数中的一个
- 为什么基类被继承两次,即使其中一个是虚拟继承的
- 确定一个方法是否是纯虚拟的(c++)
- 如何使用派生类中的虚拟函数,该函数在另一个具有基类参数的类中声明
- 当一个类有一些虚拟方法时,它的所有方法都使用 vtable 吗?
- 我可以让虚拟抽象类抛出一个异常吗?