c++ - 如何使用两个不同的参数值调用我的模拟方法两次
问题描述
假设我必须测试具有 独占 值 0 和 1(两次)的模拟方法 GetSegment。
EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _)).
WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(**exclusive**)));
谢谢,
解决方案
只做几个WillOnce
- 一个接一个。
喜欢:
EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _))
.WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(0))).
.WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(1)));
您可以在文档中读到 WillOnce 可以在一个 EXPECT_CALL 中多次使用:
EXPECT_CALL(模拟对象,方法(匹配器)).WillOnce(动作)*
有效的简化示例:
class MockMM
{
public:
MOCK_METHOD4(GetSegment, void(int refrenceId, int, int, int* a));
};
TEST(A, A)
{
MockMM mock;
EXPECT_CALL(mock, GetSegment(1, _, _, _))
.WillOnce(SetArgPointee<3>(0))
.WillOnce(SetArgPointee<3>(1));
int a;
int b;
mock.GetSegment(1, 1, 0, &a);
mock.GetSegment(1, 0, 1, &b);
ASSERT_EQ(0, a);
ASSERT_EQ(1, b);
}
您还可以使用序列:
当您有一个长链的顺序期望时,使用序列指定顺序会更容易,这不需要您为链中的每个期望赋予不同的名称。相同序列中的所有预期调用必须按照它们指定的顺序发生。
using ::testing::Sequence;
Sequence s1, s2;
...
EXPECT_CALL(foo, Reset())
.InSequence(s1, s2)
.WillOnce(Return(true));
EXPECT_CALL(foo, GetSize())
.InSequence(s1)
.WillOnce(Return(1));
EXPECT_CALL(foo, Describe(A<const char*>()))
.InSequence(s2)
.WillOnce(Return("dummy"));
推荐阅读
- amazon-web-services - IAM 角色未显示在修改 IAM 角色页面的 aws 控制台中
- vba - 宏在 excel 2010 中无法按预期工作
- c# - 我可以将 Azure.Core 命名空间用于非天蓝色项目吗?
- python - 从 2 个字符串列表中获取一个列表
- c# - 有什么方法可以在 c# winform in-project SQL Server 中插入中文吗?
- c++ - 使用函数指针为模板类指定推导指南
- python - 寻找 python 脚本将文件夹移动到具有相似名称的文件夹中
- python - 如何在 manim 中播放具有交错开始时间的动画
- python - 列表中的 Altair 注释
- javascript - 使用 JS 的 div 切换未按预期工作