C++ 如何使用GoogleMock用虚拟和非虚拟方法模拟一个类?

C++ 如何使用GoogleMock用虚拟和非虚拟方法模拟一个类?,c++,unit-testing,googletest,googlemock,C++,Unit Testing,Googletest,Googlemock,我想用GoogleMock模拟一个类。我的类既有非虚方法也有虚方法。我一直在通读这本书。这些资源提供的示例和解释提到了具有所有虚拟函数或没有虚拟函数的类,但没有一个同时具有这两种函数。所以我有两个问题: (1) 可以用虚拟/非虚拟混合类型模拟类吗 (2) 应该使用什么方法(如果问题1为真)来模拟这个类, (如果问题1为假)可以使用什么替代 如果有帮助,请提供一些代码: class Time_Device : public Time_Device_Interface { private:

我想用GoogleMock模拟一个类。我的类既有非虚方法也有虚方法。我一直在通读这本书。这些资源提供的示例和解释提到了具有所有虚拟函数或没有虚拟函数的类,但没有一个同时具有这两种函数。所以我有两个问题:

(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来测试我的一些方法,而无需模拟它们

我正在使用VisualStudio2010开发CMake

我对谷歌测试和谷歌模拟都是新手

我无法更改生产代码

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

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


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

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

类测试类
{
公众:
模板
void memfunc(T&obj);
};
类原始对象{…};
类MockObject{…};
在测试功能中:
测试类obj;
MockObject mockObj;
obj.memfun(mockObj);

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

非虚拟方法在做什么?如果调用虚拟方法,则会使您的生活变得困难。@Bааћ非虚拟方法不会调用虚拟方法。它们是一些公共虚拟方法调用的私有方法。它们也是访问硬件的方法。*唉,这就是我害怕的。例如,谢谢。这真的归结为糟糕的计划。我的C++真的生锈了,我没有想到我的测试会通过这个问题,我本来可以让它变得更容易,只是我只是想一想我的测试。你的意思是“是的,但是你必须要小心。”如果所有这些非虚拟函数都是公共函数,那么如何对它们进行模拟呢?@ratzily你不能模拟非虚拟方法。但是一个类同时包含虚拟函数和非虚拟函数是很正常的,在这种情况下,听起来我们只能用非虚拟函数进行测试functions@ratzily在这种情况下,您可以重新考虑您的设计或实现。不可能重写模拟类中的非虚拟方法。
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);