下面是我方法中的一行。在这里,我必须模拟方法"findChild"并将"Chino::mock_Button"实例分配给"close_button"。这是我的要求。
Chino::Button* close_button = findChild<Chino::Button>("CloseButton");
我尝试过的方法:
由于findChild是一个模板,我不能嘲笑它。所以我更改了findchild模板的实现,使其专门用于Chino::Button类型,并模拟新函数"getChinoButtonInstance(QString,bool)",并使其返回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。
- 第二种方法:
我们创建了一个单独的存储类。只是为了放置和获取值。在调用findchild方法之前,我将在Store类中存储Chino::mockButton实例。因此,findchild类被修改为:
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;
}
这里的问题是对象切片。我可以看到调试器显示"Chino::MockButton"实例在调用"store->getMockInstance()"时返回。但我不确定问题出在哪里,调试器没有显示"val"的值,它直接步入 findChild 语句并将 Chino::Button 实例的对象分配给"close_button"而不是 Chino::MockButton 实例。我确定问题是对象切片,但不知道如何解决这个问题。
我在第二种方法中做错了铸造。
Chino::Button *val=static_cast<Chino::Mock_Button*>(store->get(KEY_CHINO_CLOSE_BUTTON_INSTANCE));
这解决了我的问题。