c++模拟方法并在执行后捕获其输出参数之一
发布时间:2022-07-30 15:36:26 244
相关标签: # golang
我正在尝试模拟一个成员方法parseString,以便:
- 和填充输出参数(
std::vector& iReqs
)作为原始方法; - 我可以检查它的一个输出参数(
std::vector& iReqs
可能有一种简单的方法可以做到这一点,但到目前为止,我还没有找到一种干净的方法。使用GMock,我最接近的是以下内容:
- 使用lambda模拟原始方法行为
- 使用
SaveArgs
存储参数
这种方法的问题是SaveArgs
不返回任何值,这会使测试在发布模式下编译时崩溃。如果我把两者颠倒过来DoAll
声明,SaveArgs
在方法实际填充之前调用,因此它没有意义。如果我添加步骤3,并稍微修改步骤1:
- 使用lambda模拟原始方法行为和
- 使用
SaveArgs
存储参数; - 返回原始返回值;
然后它似乎未定义行为隐藏于此.
代码段:
class FooMock : public Foo
{
public:
FooMock() : Foo()
{
// By default, all calls are delegated to the real object.
// Moreover, we capture intermediary object for testing purposes
// We need to save _originalReturn otherwise we will have undef behaviour
ON_CALL(*this, parseString).WillByDefault(DoAll(
([this](const std::string& iDoc,
std::vector& iReqs) {
_originalReturn = this->Foo::parseString(iDoc, iReqs);
return _originalReturn;
}),
SaveArg<1>(&_requests),
Return(_originalReturn)
));
}
MOCK_METHOD2(parseString, bool (const std::string& iDoc,
std::vector& iReqs));
virtual ~FooMock() = default;
std::vector _requests;
private:
bool _originalReturn = false;
};
class Foo
{
public:
Foo() = default;
virtual ~Foo() = default;
bool execute( const std::string& iMessage ) {
// Calling parseString here
return true;
}
protected:
virtual bool parseString(const std::string& iMessage,
std::vector& oBom){
//Does something here
return true;
}
};
在GTest中,我应该能够做到以下几点:
TEST_F( FooMockTest, basicRequest )
{
std::string aString = "Something";
FooMock uc;
EXPECT_CALL(uc, parseString(_, _)).Times(1);
EXPECT_TRUE(uc.execute(aString));
// Test some property of the output parameter...
ASSERT_EQ(1U, uc._requests.size());
}
同样,我无法找到一种方法来连接我想要的模拟成员方法的两种行为,保留其原始行为并在其原始执行后保存 args。
我认为我的最新片段不安全,并且可能隐藏一些不一致(因为我通过一个中间变量作为 Mocked 类成员字段)。
能否请你帮忙?谢谢!
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报