没有用于初始化模拟工厂的匹配构造函数
no matching constructor for initialization of a Mock Factory
我现在正试图用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>(¶meterMock_, 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>())));
- 在 C++ 中返回新的构造函数(*this)工厂
- 没有用于初始化模拟工厂的匹配构造函数
- 设计模式的工厂替代方法:具有不同构造函数的类
- 具有多个构造函数的C 通用工厂
- 将 C 结构工厂函数与其相应的 C++ 包装类构造函数合并
- 如何将一个类的构造函数的调用限制为仅其工厂类
- C 非堆工厂对象创建具有受保护的构造函数和复制构造函数
- 具有构造函数的可变参数模板参数的工厂类
- 我可以为带有参数的构造函数创建类工厂
- 使用工厂时如何"hide"构造函数?
- 在具有boost工厂的构造函数中传递参数
- boost::p ython 纯虚拟基类,具有静态工厂构造函数和 std::unique_ptr
- 虚拟构造函数习语与工厂设计
- c++11模板工厂模式和带参数的构造函数
- 如何将参数传递给工厂元素构造函数
- 将构造函数参数传递给模板函数工厂
- 具有异构构造函数约束的c++工厂模式
- 带有参数化构造函数的抽象工厂
- 如何在工厂函数中解析构造函数签名
- 有没有一个C++习语来形容这个丑陋的构造函数/工厂