如何使用 GoogleMock 解决此对象切片问题
How to solve this Object Slicing issue with GoogleMock
下面是我的方法中的一行。在这里,我必须模拟方法 "findChild" 并使 "Chino::mock_Button" 实例分配给 "close_button"。这是我的要求。
Chino::Button* close_button = findChild<Chino::Button>("CloseButton");
我试过的方法:
因为 findChild 是一个模板,我不能模拟它。所以我更改了 findchild 模板的实现以专门针对 Chino::Button 类型并模拟新函数 "getChinoButtonInstance(QString,bool)" 并将其设为 return Chino::Mock_button 实例而不是 Chino::Button实例.
template<>
inline Chino::Button* Mediator::findChild<Chino::Button>(const QString &name, bool recursive)
{
return getChinoButtonInstance(name,recursive);
}
然后,在 UnitTestClass 中我模拟了 "getChinoButtonInstance"。
MOCK_METHOD2(getChinoButtonInstance,Chino::Mock_Button*(QString,bool));
和EXPECT_CALL是:
EXPECT_CALL(*wLighting,getChinoButtonInstance("a",true)).Times(testing::AtLeast(1)).WillOnce(testing::ReturnPointee(&wLighting->sourceButtonMock));
这里我尝试使用 Return 和 ReturnRef,而不是 ReturnPointee。在所有情况下,findchild 都将 "close_button" 分配给 nullptr.
- 第二种方法:
我们创建了一个单独的商店 class。只是为了在调用 findchild 方法之前放置和获取 values.Here,我将把 Chino::mockButton 实例存储在 Store class 中。所以findchild class被修改为:
template<>
inline Chino::Button* Mediator::findChild<Chino::Button>(const QString &name, bool recursive)
{
HarmanUTestStore *store=HarmanUTestStore::instance();
Chino::Mock_Button *val=dynamic_cast<Chino::Mock_Button*>(store->getMockInstance());
return val;
}
这里的问题是对象切片。当 "store->getMockInstance()" 被调用时,我可以看到调试器显示 "Chino::MockButton" 实例正在被 returned。但我不确定问题出在哪里,调试器没有显示 "val" 的值,而是直接进入 findChild 语句并将 Chino::Button 实例的对象分配给 "close_button" Chino::MockButton 个实例。
我确定问题出在对象切片上,但不知道如何解决这个问题。
我在第二种方法中做错了转换。
Chino::Button *val=static_cast<Chino::Mock_Button*>(store->get(KEY_CHINO_CLOSE_BUTTON_INSTANCE));
这解决了我的问题。
下面是我的方法中的一行。在这里,我必须模拟方法 "findChild" 并使 "Chino::mock_Button" 实例分配给 "close_button"。这是我的要求。
Chino::Button* close_button = findChild<Chino::Button>("CloseButton");
我试过的方法:
因为 findChild 是一个模板,我不能模拟它。所以我更改了 findchild 模板的实现以专门针对 Chino::Button 类型并模拟新函数 "getChinoButtonInstance(QString,bool)" 并将其设为 return Chino::Mock_button 实例而不是 Chino::Button实例.
template<> inline Chino::Button* Mediator::findChild<Chino::Button>(const QString &name, bool recursive) { return getChinoButtonInstance(name,recursive); }
然后,在 UnitTestClass 中我模拟了 "getChinoButtonInstance"。
MOCK_METHOD2(getChinoButtonInstance,Chino::Mock_Button*(QString,bool));
和EXPECT_CALL是:
EXPECT_CALL(*wLighting,getChinoButtonInstance("a",true)).Times(testing::AtLeast(1)).WillOnce(testing::ReturnPointee(&wLighting->sourceButtonMock));
这里我尝试使用 Return 和 ReturnRef,而不是 ReturnPointee。在所有情况下,findchild 都将 "close_button" 分配给 nullptr.
- 第二种方法:
我们创建了一个单独的商店 class。只是为了在调用 findchild 方法之前放置和获取 values.Here,我将把 Chino::mockButton 实例存储在 Store class 中。所以findchild class被修改为:
template<>
inline Chino::Button* Mediator::findChild<Chino::Button>(const QString &name, bool recursive)
{
HarmanUTestStore *store=HarmanUTestStore::instance();
Chino::Mock_Button *val=dynamic_cast<Chino::Mock_Button*>(store->getMockInstance());
return val;
}
这里的问题是对象切片。当 "store->getMockInstance()" 被调用时,我可以看到调试器显示 "Chino::MockButton" 实例正在被 returned。但我不确定问题出在哪里,调试器没有显示 "val" 的值,而是直接进入 findChild 语句并将 Chino::Button 实例的对象分配给 "close_button" Chino::MockButton 个实例。 我确定问题出在对象切片上,但不知道如何解决这个问题。
我在第二种方法中做错了转换。
Chino::Button *val=static_cast<Chino::Mock_Button*>(store->get(KEY_CHINO_CLOSE_BUTTON_INSTANCE));
这解决了我的问题。