c++ - 没有匹配的构造函数来初始化 Mock Factory

标签 c++ unit-testing factory

我现在正在尝试使用 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>(&parameterMock_, 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/

相关文章:

c++ - 为什么 GLU 会在这个地方崩溃?

c++ - Visual Studio 中 dllimport 的用例

C++(半)文件保存/加载的反射? (黑客?)

unit-testing - 单元测试和验收测试是否足够?

c++ - 在 C++ 中映射两种对象类型

c++ - C++/CLI 能否将抽象类从 C++ 返回到 C#?

c# - 尽管抛出异常,但测试 ExpectedException 的单元测试失败

java - 为接口(interface)的多个实现编写单个单元测试

c++ - (静态初始化/模板实例化)工厂模式的问题

c++ - 使用模板基类消除工厂类派生类冗余的简洁方法