C++ Google模拟ByRef方法

C++ Google模拟ByRef方法,c++,googletest,gmock,C++,Googletest,Gmock,我有一个将布尔值作为引用参数并返回整数的类: class Foo { public: Bar my_bar; virtual int myMethod(bool &my_boolean) = 0; } /*...*/ int Foo::myMethod(bool &my_boolean){ if (my_bar == NULL){ my_boolean = false; return -1; } else{ my_boo

我有一个将布尔值作为引用参数并返回整数的类:

class Foo
{
  public:
    Bar my_bar;
    virtual int myMethod(bool &my_boolean) = 0;
}

/*...*/

int Foo::myMethod(bool &my_boolean){
  if (my_bar == NULL){
    my_boolean = false;
    return -1;
  }
  else{
    my_boolean = true;
    return 0;
  }

}
我为这个类创建了一个模拟:

class MockFoo : public Foo
{
   MOCK_METHOD1(myMethod,int(bool &my_boolean));
}
我在如何设置此类函数的期望值方面遇到了问题,因为我需要将返回值和引用参数设置为特定值,以正确创建单元测试。如何使用gmock处理此类函数?我尝试了以下我认为是文档中的解决方案:

using ::testing::SetArgPointee;

class MockMutator : public Mutator {
  public:
  MOCK_METHOD2(Mutate, void(bool mutate, int* value));
  ...
};
  ...

MockMutator mutator;
EXPECT_CALL(mutator, Mutate(true, _))
  .WillOnce(SetArgPointee<1>(5));
使用::testing::SetArgPointee;
类MockMutator:公共Mutator{
公众:
MOCK_方法2(Mutate,void(bool Mutate,int*value));
...
};
...
模拟突变子;
EXPECT_调用(mutator,Mutate(true,)))
.WillOnce(SetArgPointee(5));
但要么我不理解这个例子,要么它不适用于这个案例。以前有人处理过这种情况吗


提前谢谢。

你的问题很难回答!谷歌模拟“烹饪书”的样本也是如此

您是想在模拟类中重用
Foo::myMethod()
的实现,还是只想模拟特定调用情况的副作用(返回值和按ref参数更改)

模拟类通常用于替换/模拟
Foo
类,而不是直接继承它或它的行为。不知道为纯方法定义这种“默认”行为的方式是否有效,但对此表示怀疑。您可以简单地省略
=0
。 更好的方法是分离出真正的接口声明,如:

struct IFoo
{
    virtual int myMethod(bool &my_boolean) = 0;
    virtual ~IFoo() {}
};

class Foo : public IFoo
{
    // ...
};

class MockFoo : public IFoo
{
   MOCK_METHOD1(myMethod,int(bool &my_boolean));
};
如果您有后一种情况,您应该使用
testing::Return(value)
testing::setargreference(value)
(在中发现这非常有用)

您的期望呼叫应该如下所示:

MockFoo foo;

// Expect call to myMethod() return -1 and set the by ref argument to true
EXPECT_CALL(foo, myMethod(_))
  .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1)));

// Expect call to myMethod() return 0 and set the by ref argument to false
EXPECT_CALL(foo, myMethod(_))
  .WillOnce(DoAll(SetArgReferee<0>(false),Return(0)));
MockFoo-foo;
//期望调用myMethod()返回-1并将by ref参数设置为true
EXPECT_调用(foo,myMethod(u))
.WillOnce(DoAll(setargreference(true),Return(-1));
//期望调用myMethod()返回0,并将by ref参数设置为false
EXPECT_调用(foo,myMethod(u))
.WillOnce(DoAll(setargreference(false),Return(0));

如果您真的想重用
myMethod()
的原始类逻辑,请分别查看

抱歉@g-makulik我复制粘贴了错误的代码段,该代码段与此问题无关。我现在已经更正了它。此外,抱歉,我花了一些时间来解决您的问题
ByRef()
是此案例的错误路径。@RodrigoVasconcelos不再感兴趣了?这解决了你的问题吗?确实解决了,谢谢@g-makulik!很抱歉这么长时间的沉默,我的国家目前正经历一些动荡,这让我有几天没有工作。@RodrigoVasconcelos Brazil?那么我不明白你的问题是什么。你能详细说明你的问题吗?代码对我来说似乎是正确的。或者您想知道如何类似地设置参考参数的期望值吗
ByRef()
完全可以做到这一点。+1这很难从烹饪书的例子中得到。