如何使用两个不同的参数值两次调用我的模拟方法

时间:2018-11-10 11:04:12

标签: c++ googletest googlemock gmock

假设我必须用 exclusive 值0和1(两次)测试模拟方法GetSegment。

true
false
false
true

谢谢

1 个答案:

答案 0 :(得分:0)

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

您可以在doc中阅读到,WillOnce可以在一个EXPECT_CALL中多次使用:

  

EXPECT_CALL(mock_object,method(matchers))       .WillOnce(action)*

有效的简化示例:

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);

}

您也可以使用sequences

  

如果您有很长的顺序期望链,则更容易   使用序列指定顺序,不需要您指定   链中的每个期望都有不同的名称。所有预期来电   必须按照指定的顺序执行相同的顺序。

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"));