我有一个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的不同实例?
答案 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