我现在正在尝试使用 gmock/gtest 对我的工厂进行单元测试,但我无法让我的测试实际使用我想要测试的模拟对象,此时我觉得我是做一些根本性的错误。
我有以下架构(不包括 header ) 使用工厂和 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 类返回对象类的实例,如下所示:
对象工厂.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;
};
集合.h
class Collection : public ICollection
{
public:
Collection(IParameter *parameter, double& slider, FilterFactoryPtr&& filterFactory);
~Collection() override;
private:
ObjectFactoryPtr objectFactory_ {};
ObjectPtr object_ {};
Collection 类将 ObjectFactory 注入(inject)到它的构造函数中,并在构造函数中使用它创建一个 Object 实例,如下所示:
集合.cpp
Collection::Collection(IParameter *parameter, double aValue, ObjectFactoryPtr&& objectFactory)
: objectFactory (std::move(objectFactory))
{
object_ = objectFactory->create();
}
最后,在 Collection 类的函数调用中,调用了 Object 类的 objectFunction。
为了测试 Object、ObjectFactory 和 Collection 的行为,我写了一些这样的模拟:
对象模拟.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* ());
}
参数模拟.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>));
}
但是,我得到的不是测试结果,而是以下错误,暗示了我对 Return 的期望:
错误:没有用于调用“ImplicitCast_”的匹配函数 value_(ImplicitCast_(value_before_cast_)) {} ^~~~~~~~~~~~~~~~~~~~~ 注意:在成员函数 'testing::internal::ReturnAction > (*)()>::Impl, std::__1::default_delete > (*)(), IObject *()>::Impl' 的实例化中请求这里 返回 Action (新实现(value_)); ^ 注意:在函数模板专门化的实例化中,此处请求“testing::internal::ReturnAction > (*)()>::operator Action” .WillByDefault(返回(std::make_unique));
此时我有点绝望,很乐意听到有关该主题的任何建议。
提前致谢, 西蒙
最佳答案
原来我只需要将“ByMove”添加到我的 ON_CALL 语句中,以指示我的模拟对象不要调用复制构造函数,该构造函数由于 unique_ptr 而被删除。
因此,声明
ON_CALL(*objectFactoryMock, create())
.WillByDefault(Return(std::make_unique<Object>()));
必须是
ON_CALL(*objectFactoryMock, create())
.WillByDefault(Return(ByMove((std::make_unique<Object>())));
关于c++ - 没有匹配的构造函数来初始化 Mock Factory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51563058/