我有一个课我希望使用Google Mock进行模拟。我的班级有非虚拟和虚拟方法。我一直在阅读Google Mock ForDummies和Google 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的新手
我无法更改生产代码。
答案 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);
尝试模拟非虚拟公共成员函数没有任何意义,因为它的功能不能被模拟行为替换。