首页 > 解决方案 > 如何使用两个不同的参数值调用我的模拟方法两次

问题描述

假设我必须测试具有 独占 值 0 和 1(两次)的模拟方法 GetSegment。

EXPECT_CALL(*mock.get(), GetSegment(refrenceId, _, _, _)).
WillOnce(DoAll(SetArgReferee<1>(numSegment), SetArgPointee<2>(points), SetArgPointee<3>(**exclusive**)));

谢谢,

标签: c++googletestgooglemockgmock

解决方案


只做几个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"));

推荐阅读