Gmock返回新对象的实例

时间:2018-01-05 00:03:53

标签: gmock

我有一个MockWidgetFactory。我想在调用createWidget时返回新的MockWidgets实例,这适用于我希望单个调用的时候:

EXPECT_CALL(*mock_widget_factory_, createWidget(_, _))
.WillOnce(Return(new MockWidget));

但是当我期待多次调用时,我发现返回了相同的MockWidget:

EXPECT_CALL(*mock_widget_fatory_, createWidget(_, _))
.Times(4)
.WillRepeatedly(Return(new MockWidget));

我知道这是因为在来源:

IWidget* widgetA = WidgetFactory().createWidget(3, 4);
IWidget* widgetB = WidgetFactory().createWidget(5, 6);
IWidget* widgetC = WidgetFactory().createWidget(10, 12);
IWidget* widgetD = WidgetFactory().createWidget(20, 23);

我看到widgetA,widgetB,widgetC和widgetD都指向同一个地址。

但是,如果我将这个期望语句分解为一个序列,我看到四个MockWidgets是不同的:

{
    InSequence createWidgets;

    EXPECT_CALL(*mock_widget_fatory_, createWidget(_, _))
    .WillOnce(Return(new MockWidget));

    EXPECT_CALL(*mock_widget_fatory_, createWidget(_, _))
    .WillOnce(Return(new MockWidget));

    EXPECT_CALL(*mock_widget_fatory_, createWidget(_, _))
    .WillOnce(Return(new MockWidget));

    EXPECT_CALL(*mock_widget_fatory_, createWidget(_, _))
    .WillOnce(Return(new MockWidget));
}

显然,每个MockWidget都有一个期望语句不是很优雅,所以我对WillRepeated的遗漏是什么让我不能返回MockWidget的不同实例?

1 个答案:

答案 0 :(得分:0)

你现在可能已经找到了答案。不过,对于未来的寻求者:

使用ReturnNew<T>代替Return

在GitHub中进行快速定向搜索可以为您提供足够的如何使用它的示例:
https://github.com/search?l=C++&q=WillRepeatedly+ReturnNew&type=Code

P.S。一个完全侧面的建议:假设是程序员最大的敌人之一(在这种情况下,假设Return将始终评估它通过的内容)。浏览新框架的文档从未受到伤害,即使您只需按照教程即可启动并运行它。当您基于框架继承遗留代码时尤其如此。查看其doc文件的额外一天将在几周后为您节省时间。

检查gmock中的返回值:
https://github.com/google/googletest/blob/master/googlemock/docs/CheatSheet.md#returning-a-value