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

时间:2014-08-01 21:32:57

标签: c++ unit-testing googletest googlemock

我有一个课我希望使用Google Mock进行模拟。我的班级有非虚拟和虚拟方法。我一直在阅读Google Mock ForDummiesGoogle Mock CookBook。这些资源提供的示例和解释提到具有ALL虚函数或NO虚函数的类,但不包含两者。所以我有两个问题:

(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测试来测试一些我的方法没有嘲弄他们。

我正在使用Visual Studio 2010开发,CMake

我是Google Test和Google Mock的新手

我无法更改生产代码。

2 个答案:

答案 0 :(得分:5)

  

(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是假的)可以用什么方法呢?

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

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

答案 1 :(得分:0)

您需要重写使模拟类接受对象作为模板参数的类。这样你就可以重写整个模拟类,包括虚拟和非虚拟类。但是,您需要注意接口是否相同,以便不能将任意类传递给TestedClass :: memfunc(T&)。

class TestedClass
{
public:
   template<typename T>
   void memfunc(T& obj);
};

class OriginalObject {...};
class MockObject {...};

in the test-function:
TestedClass obj;
MockObject  mockObj;
obj.memfun(mockObj);

尝试模拟非虚拟公共成员函数没有任何意义,因为它的功能不能被模拟行为替换。