Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用两个不同的参数值调用mock方法两次_C++_Googletest_Googlemock_Gmock - Fatal编程技术网

C++ 如何使用两个不同的参数值调用mock方法两次

C++ 如何使用两个不同的参数值调用mock方法两次,c++,googletest,googlemock,gmock,C++,Googletest,Googlemock,Gmock,假设我必须使用exclusive值0和1(两次)测试模拟方法GetSegment EXPECT_调用(*mock.get(),GetSegment(referenceId,,,,))。 WillOnce(DoAll(setargreference(numSegment)、SetArgPointee(points)、SetArgPointee(**独占**)); 谢谢,只要做几个就可以了,一个接一个 比如: EXPECT_调用(*mock.get(),GetSegment(referenceId

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

EXPECT_调用(*mock.get(),GetSegment(referenceId,,,,))。
WillOnce(DoAll(setargreference(numSegment)、SetArgPointee(points)、SetArgPointee(**独占**));

谢谢,

只要做几个
就可以了,一个接一个

比如:

EXPECT_调用(*mock.get(),GetSegment(referenceId,,,,))
.WillOnce(DoAll(setargreference(numSegment)、SetArgPointee(points)、SetArgPointee(0)))。
.WillOnce(DoAll(setargreference(numSegment)、SetArgPointee(points)、SetArgPointee(1));
您可以从中了解到,WillOnce可以在一次EXPECT\u调用中多次使用:

EXPECT_调用(模拟_对象、方法(匹配器)) .威洛斯(行动)*

工作原理的简化示例:

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

}
class-MockMM
{
公众:
MOCK_METHOD4(GetSegment,void(int referenceId,int,int,int*a));
};
测试(A,A)
{
MockMM mock;
期望调用(mock,GetSegment(1,,,,,))
.WillOnce(SetArgPointee(0))
.WillOnce(SetArgPointee(1));
INTA;
int b;
mock.GetSegment(1、1、0和a);
mock.GetSegment(1,0,1和b);
断言式(0,a);
断言式(1,b);
}
您还可以使用:

当你有一长串连续的期望时,更容易 使用序列指定顺序,而不需要指定 链中的每个期望都有不同的名称。所有预期呼叫均已接通 相同的顺序必须按照指定的顺序出现

使用::testing::Sequence;
序列s1,s2;
...
EXPECT\u调用(foo,Reset())
.不连续(s1、s2)
.WillOnce(返回(true));
EXPECT\u调用(foo,GetSize())
.不连续(s1)
.WillOnce(返回(1));
EXPECT\u调用(foo,descripe(A()))
.不连续(s2)
.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)));
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"));