返回

c++模拟方法并在执行后捕获其输出参数之一

发布时间:2022-07-30 15:36:26 244
# golang

我正在尝试模拟一个成员方法parseString,以便:

  1. 和填充输出参数(std::vector& iReqs)作为原始方法;
  2. 我可以检查它的一个输出参数(std::vector& iReqs

可能有一种简单的方法可以做到这一点,但到目前为止,我还没有找到一种干净的方法。使用GMock,我最接近的是以下内容:

  1. 使用lambda模拟原始方法行为
  2. 使用SaveArgs存储参数

这种方法的问题是SaveArgs不返回任何值,这会使测试在发布模式下编译时崩溃。如果我把两者颠倒过来DoAll声明,SaveArgs在方法实际填充之前调用,因此它没有意义。如果我添加步骤3,并稍微修改步骤1:

  1. 使用lambda模拟原始方法行为和
  2. 使用SaveArgs存储参数;
  3. 返回原始返回值;

然后它似乎未定义行为隐藏于此.

代码段:

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 类成员字段)。

能否请你帮忙?谢谢!

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像