【问题标题】:How to solve this Object Slicing issue with GoogleMock如何使用 GoogleMock 解决此对象切片问题
【发布时间】:2016-07-12 12:46:18
【问题描述】:

下面是我方法中的一行。在这里,我必须模拟方法“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);   
    }
    

然后,在 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. 第二种方法:

我们创建了一个单独的商店类。只是为了放置和获取值。在调用 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->getMockInstance()”时,我可以看到调试器显示“Chino::MockButton”实例正在返回。但我不确定问题出在哪里,调试器没有显示“val”的值,而是直接进入 findChild 语句并将 Chino::Button 实例的对象分配给“close_button”而不是 Chino::MockButton实例。 我确定问题是对象切片,但不知道如何解决这个问题。

【问题讨论】:

  • 检查您的模板专业化是否真的被调用。如果您仅在 UT 代码中重新定义它 - 那么您的测试代码可能不会意识到这一点 - 并且仍然使用默认版本。那可以违反一个定义规则。您可以进行一些调试 - 或通过 objdump 或 nm 进行检查
  • 我可以看到模板专业化在调试时被调用。

标签: c++ googletest gmock object-slicing


【解决方案1】:

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

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

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多