没有用于初始化模拟工厂的匹配构造函数

no matching constructor for initialization of a Mock Factory

本文关键字:构造函数 工厂 模拟 用于 初始化      更新时间:2023-10-16

我现在正试图用gmock/gtest对我的工厂进行单元测试,但我无法让我的测试真正使用我想要测试的mock对象,在这一点上,我觉得我做了一些根本错误的事情。

我有以下体系结构(不包括标头(带有Factory和ObjectFactory:

class IObject
{
public:
virtual ~IObject() {};
virtual void objectFunction(int someValue) = 0;
};
using ObjectPtr = std::unique_ptr<IObject>;
class IObjectFactory
{
public:
virtual ~IObjectFactory() {};
virtual std::unique_ptr<IObject> create() = 0;
};
using ObjectFactoryPtr = std::unique_ptr<IObjectFactory>;

ObjectFactory类返回对象类的一个实例,如下所示:

ObjectFactory.h

class ObjectFactory : public IObjectFactory
{
public:
ObjectFactory() {};
~ObjectFactory() override {};
std::unique_ptr<IObject> create() override
{
return std::make_unique<Object>();
}
};

我还有收集类

ICollection.h

class ICollection
{
public:
virtual ~ICollection() {};
virtual void someFunction(int value) = 0;
};

Collection.h

class Collection : public ICollection
{
public:
Collection(IParameter *parameter, double& slider, FilterFactoryPtr&& filterFactory);
~Collection() override;
private:
ObjectFactoryPtr objectFactory_ {};
ObjectPtr object_ {};

Collection类在其构造函数中注入ObjectFactory,并在构造函数中创建一个Object实例,如下所示:

Collection.cpp

Collection::Collection(IParameter *parameter, double aValue, ObjectFactoryPtr&& objectFactory)
: objectFactory (std::move(objectFactory))
{
object_ = objectFactory->create();
}

最后,在集合类的函数调用中,调用对象类中的objectFunction。

为了测试Object、ObjectFactory和Collection的行为,我写了一些类似的mock:

ObjectMock.h

class ObjectMock : public IMock
{
public:
virtual ~ObjectMock() {}
MOCK_METHOD1(objectFunction, void(int someValue));
};

ObjectFactoryMock.h

class ObjectFactoryMock : public IObjectFactory
{
public:
virtual ~ObjectFactoryMock() {}
virtual std::unique_ptr<IObject> create()
{
return std::unique_ptr<dearvrDir::IObject>(createProxy());
}
MOCK_METHOD0(createProxy, IObject* ());
}

ParameterMock.h

class ParameterMock : public IParameterMock
{
public:
virtual ~ParameterMock() {}
MOCK_CONST_METHOD0(getValue, double());
}

最后,我想运行以下测试来验证objectFactory对象的create((调用:

class UnitTest_CollectionTestCase : public ::testing::Test
{
protected:
std::unique_ptr<Collection> collection_;
ParameterMock parameterMock_;
};
TEST_F(UnitTest_CollectionTestCase, calls_create_on_factory)
{
double value = 123;
collection_ = std::make_unique<Collection>(&parameterMock_, value, std::make_unique<ObjectFactoryMock>());
auto&& objectFactoryMock = std::make_unique<NiceMock<ObjectFactoryMock>>();
ON_CALL(*objectFactoryMock, create())
.WillByDefault(Return(std::make_unique<Object>));
}

然而,我得到的不是测试结果,而是以下错误,暗示了我的退货期望:

错误:对"ImplicitCast_"的调用没有匹配的函数value_(ImplicitCast_(value_before_cast_(({}^~~~~~~~~~~~~~~~~~~~~注意:在实例化成员函数"testing::internal::ReturnAction>(*(((>::Impl,std::__1::default_delete>(*return Action(new Impl(value_((;^注意:在函数模板特殊化的实例化中,此处请求"testing::internal::ReturnAction>(*(((>::operator Action".WillByDefault(返回(std::make_unique((;

在这一点上,我有点绝望,很乐意听到任何关于这个话题的建议。

提前感谢,Simon

原来我只需要在ON_CALL语句中添加"ByMove",以指示我的mock对象不要调用复制构造函数,该构造函数由于unique_ptr而被删除。

因此,陈述

ON_CALL(*objectFactoryMock, create())
.WillByDefault(Return(std::make_unique<Object>()));

必须是

ON_CALL(*objectFactoryMock, create())
.WillByDefault(Return(ByMove((std::make_unique<Object>())));