c++ 在MOCK_METHOD中,如何避免不将可复制对象传递给MATCHER?

cu6pst1q  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(165)

我正在尝试让MOCK_METHODBarClass::Bar抛出异常,但似乎遇到了以下错误
错误:呼叫'FooMock'的隐含删除复制建构函式
它可能发生在MATCHER_P内部的==
看起来好像MOCK_METHOD创建了一个不可复制的数据成员,但是这给我留下了一个使用指针的选项,我不能真正使用指针,因为BarClass::BarfooMock作为引用。
有没有办法将解除引用的对象传递给Matcher

class FooClass
{
    public:
    virtual void Foo() const{}
};

class FooMock : public FooClass
{
    public:
    MOCK_METHOD(void, Foo, (), (const override));
};

struct BarClass
{
    void Bar(const FooMock& fooMock) {}
};

class BarMock : public BarClass
{
    public:
    MOCK_METHOD(void, Bar, (FooMock& fooMock), (const override));
};

MATCHER_P(Matcher, fooMock, "")
{
    return arg == fooMock;
}

ACTION(MyThrowException)    
{
  throw std::invalid_argument("Some exception thrown!");
}

TEST(UtClass, Test)
{
    auto fooMock = std::make_shared<FooMock>();
    BarMock barMock;
    
    EXPECT_CALL(barMock, Bar (Matcher(*fooMock))) // <-- problem here
            .Times(1)
            .WillRepeatedly(MyThrowException());

    barMock.Bar(*fooMock);       // should throw
}

https://godbolt.org/z/rEGzxjoaY

thtygnil

thtygnil1#

默认情况下,matchers的参数是通过copy传递的。这里有一些说明。你可以通过将你的参数 Package 在std::ref()或更好的std::cref()中来解决这个问题,这样你就不会意外地修改它:

EXPECT_CALL(barMock, Bar (Matcher(std::cref(*fooMock))))
            .Times(1)
            .WillRepeatedly(MyThrowException());

https://godbolt.org/z/1r695brK4

相关问题