如何使用GoogleMock解决此对象切片问题

时间:2016-07-12 12:46:19

标签: c++ googletest gmock object-slicing

以下是我方法中的一行。在这里,我必须模拟方法“findChild”并将“Chino :: mock_Button”实例分配给“close_button”。这是我的要求。

 Chino::Button* close_button = findChild<Chino::Button>("CloseButton");

我试过的方法:

  1. 由于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);   
    }
    
  2. 然后,在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。

    1. 第二种方法:
    2. 我们创建了一个单独的商店类。只是为了放置和获取值。在调用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;
      }
      

      这里的问题是对象切片。我可以看到调试器显示在调用“store-&gt; getMockInstance()”时正在返回“Chino :: MockButton”实例。但我不确定问题出在哪里,调试器没有显示“val”的值,它直接进入findChild语句并将Chino :: Button实例的对象分配给“close_button”而不是Chino :: MockButton实例。 我确定问题是对象切片,但不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

我在第二种方法中做错了。

Chino::Button *val=static_cast<Chino::Mock_Button*>(store->get(KEY_CHINO_CLOSE_BUTTON_INSTANCE));

这解决了我的问题。