我正在尝试让MOCK_METHOD
BarClass::Bar
抛出异常,但似乎遇到了以下错误
错误:呼叫'FooMock'的隐含删除复制建构函式
它可能发生在MATCHER_P
内部的==
。
看起来好像MOCK_METHOD
创建了一个不可复制的数据成员,但是这给我留下了一个使用指针的选项,我不能真正使用指针,因为BarClass::Bar
将fooMock
作为引用。
有没有办法将解除引用的对象传递给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
}
1条答案
按热度按时间thtygnil1#
默认情况下,matchers的参数是通过copy传递的。这里有一些说明。你可以通过将你的参数 Package 在
std::ref()
或更好的std::cref()
中来解决这个问题,这样你就不会意外地修改它:https://godbolt.org/z/1r695brK4