아래는 내 방법의 줄 중 하나입니다. 여기서는 "findChild"메소드를 모의하고 "close_button"에 할당 할 "Chino :: mock_Button"인스턴스를 만들어야합니다. 이것이 내 요구 사항입니다.
Chino::Button* close_button = findChild<Chino::Button>("CloseButton");
내가 시도한 방법 :
findChild는 템플릿이므로 조롱 할 수 없습니다. 그래서 findchild 템플릿의 구현을 Chino :: Button 유형으로 전문화하고 새 함수 "getChinoButtonInstance (QString, bool)"를 모의하여 Chino :: Button 인스턴스가 아닌 Chino :: Mock_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));
여기서 ReturnPointee 대신 Return 및 ReturnRef를 사용해 보았습니다. 모든 경우에 findchild는 nullptr에 "close_button"을 할당합니다.
별도의 상점 클래스가 작성되었습니다. 값을 입력하고 가져 오기 위해 여기에서 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;
}
여기서 문제는 Object Slicing입니다. "store-> getMockInstance ()"가 호출 될 때 "Chino :: MockButton"인스턴스가 반환되는 것을 보여주는 디버거를 볼 수 있습니다. 하지만 문제가 어디인지 잘 모르겠습니다. 디버거가 "val"값을 표시하지 않고 findChild 문으로 직접 들어가서 Chino :: MockButton 대신 "close_button"에 Chino :: Button 인스턴스의 개체를 할당합니다. 예. 문제가 Object Slicing이라고 확신하지만이 문제를 해결하는 방법을 모릅니다.
두 번째 접근 방식에서 잘못된 캐스팅을하고있었습니다.
Chino::Button *val=static_cast<Chino::Mock_Button*>(store->get(KEY_CHINO_CLOSE_BUTTON_INSTANCE));
이것은 내 문제를 해결했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다