如何使用Google mock用虚拟和非虚拟方法模拟一个类

How to mock a class with both virtual and non-virtual methods using Google Mock?

本文关键字:虚拟 一个 模拟 Google 何使用 mock 方法      更新时间:2023-10-16

我有一个类,我希望使用谷歌模拟模拟。我的类有非虚拟和虚拟方法。我已经通读了《谷歌模拟傻瓜》和《谷歌模拟食谱》。这些参考资料提供的示例和解释提到的类要么具有全部虚函数,要么没有虚函数,但没有一个类同时具有两者。所以我有两个问题:

(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为假)可以用什么代替?

这个问题有点奇怪。您说非虚拟方法是私有的,因此您不能访问它们。这就只剩下使用虚方法的选项了。

这意味着,创建一个模拟类的实例,并将其传递给应该使用它的对象。这种方法叫做依赖注入,注入依赖有几种方法。