gpt4 book ai didi

c++ - 谷歌模拟 ByRef 方法

转载 作者:太空宇宙 更新时间:2023-11-04 13:00:56 25 4
gpt4 key购买 nike

我有一个类将 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 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));

但是要么我不理解这个例子,要么它不适用于这种情况。以前有人处理过这种情况吗?

提前致谢。

最佳答案

你的问题很难回答!来自 google mocks 'cook book' 的示例也是如此。

您想重用 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++ - 谷歌模拟 ByRef 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com