我有一个使用 bool 值作为引用参数并返回整数的类:
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)创建了一个模拟:
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));
但是我要么不理解该示例,要么不适用于此案例。之前有没有人处理过这种情况?
提前致谢。
最佳答案
您的问题很难得到!谷歌模拟“ cooking 书”中的示例也是如此。
您是否要在模拟类中重用Foo::myMethod()
的实现,还是只想模拟特定调用情况的副作用(返回值并由ref参数更改)?
模拟类通常是要替换/模拟您的Foo
类,而不是直接继承它或其行为。不知道您为纯方法定义此“默认”行为的方式是否可行,但对此表示怀疑。然后,您可以简单地省略= 0
。
更好的方法是分离出一个真实的接口(interface)声明,例如:
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::SetArgReferee<N>(value)
(在非常有用的'Cheat Sheet'中找到它)下车。您的期望电话应如下所示:
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)));
如果您真的想为
myMethod()
重用原始的类逻辑,请查看'Delegating calls to a parent class'。 'Delegating Calls to a Real Object'关于c++ - Google模拟ByRef方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17239792/