gpt4 book ai didi

c++ - 具有 unique_ptr 引用类型参数的模拟函数的 EXPECT_CALL

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:01 24 4
gpt4 key购买 nike

我想对以下功能进行单元测试:

void
MyClass::add(const Shape& shape)
{
std::unique_ptr< Line> line;
if (m_DataBase.getLine(shape->getId(), line).ok())
{
addEntry(line->getDimensions());
}
}

为此,我需要模拟 DataBase 类的 getLine 函数:

class DataBase
{
public:
virtual Result getLine(const ShapeId& shapeId, const std::unique_ptr< Line >& line) = 0;
...
}

数据库类模拟:

class DataBaseMock
{
public:
MOCK_METHOD2(getLine, Result(const ShapeId& shapeId, const std::unique_ptr< Line >& line));
...
};

MyClass::add函数测试如下:

MyClassTest::MyClassTest{
DataBaseMock m_DataBaseMock;
std::unique_ptr< MyClass> m_MyClass;
}

void MyClassTest::setUp(){
m_MyClass = std::unique_ptr< MyClass >(new MyClass(m_DataBaseMock));
}

void MyClassTest::Test_Add()
{
Shape shape;
std::unique_ptr <Line> line = std::unique_ptr <Line> (new Line());

EXPECT_CALL(m_DataBaseMock, getLine(_,_)).WillOnce(DoAll(SetArgReferee< 1 >(line), Return(Result::OK);
CPPUNIT_ASSERT_NO_THROW(m_MyClass->add(shape));
}

虽然上面的代码在 getLine 函数将 shared_ptr 作为参数时有效,但在 unique_ptr 的情况下,EXPECT_CALL 行会出现以下错误:

error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Line; _Dp = std::default_delete<Line>]'
EXPECT_CALL(m_DataBaseMock, getLine(_,_)).WillOnce(DoAll(SetArgReferee< 1 >(line), Return(Result::OK);

最佳答案

解决方案包含一个技巧,即将 getLine() 方法委托(delegate)给一个不采取移动的模拟方法(我们称它为 callGetLine())-只有 std::unique_ptr 参数:

MOCK_METHOD2(callGetLine, Result(const ShapeId& shapeId, Line* line));
Result getLine(const ShapeId& shapeId, const std::unique_ptr< Line >& line) {
return callGetLine(shapeId, line.get());
}

请注意,无需在基类中定义或声明 callGetLine()。您只需要在模拟类中将其定义为 MOCK_METHOD

现在您在 callGetLine() 方法上设置期望值。

EXPECT_CALL(m_DataBaseMock, callGetLine(_,NotNull()).WillOnce(Return(Result::OK));

关于c++ - 具有 unique_ptr 引用类型参数的模拟函数的 EXPECT_CALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958137/

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