Просто сделайте несколько 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, метод (сопоставители))
.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"));