我使用 Hippo Mocks 取得了巨大的成功,但我有一种情况,我不太清楚如何正确设置。被测代码看起来像这样:
auto firstName = record.at("firstName").getValue();
auto lastName = record.at("lastName").getValue();
WhereIRecord::at()
返回 a IColumn&
,它有一个纯虚getValue()
方法。我正在尝试使用和的模拟版本测试我的Irecord
代码IColumn
:
auto mockRec = mocks.InterfaceMock<IRecord>();
auto mockCol = mocks.InterfaceMock<IColumn>();
我可以很好地设定期望firstName
:
mocks.OnCall(mockRec, IRecord::at).With("firstName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).Return(std::string("John")));
但我想将IColumn
模拟重用于下一个期望lastName
。
mocks.OnCall(mockRec, IRecord::at).With("lastName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).Return(std::string("Doe")));
getValue()
但是当我运行它时,Hippo Mocks 会为这两个调用返回“John” 。
按照教程,我尝试限制“firstName”和“lastName”调用的顺序:
auto& firstCall = mocks.OnCall(mockRec, IRecord::at).With("firstName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).After(firstCall).Return(std::string("John")));
auto& lastCall = mocks.OnCall(mockRec, IRecord::at).With("lastName").Return(std::ref(*mockCol));
mocks.OnCall(mockCol, IColumn::getValue).After(lastCall).Return(std::string("Doe")));
getValue()
但是两个电话我仍然得到“约翰” 。
问:是否可以重用IColumn
接口并告诉 Hippo Mocks 在每次调用时返回不同的值,getValue()
就像我需要的那样,或者我是否坚持IColumn
为每个参数创建单独的模拟?注意:我的实际实现将有两个以上的参数,因此重用IColumn
模拟减少了每个单元测试的大量设置。