繁体   English   中英

使用依赖注入和 mocking 它与 gmock

[英]Using dependency injection and mocking it with gmock

我在我的代码中实现了依赖注入模式。 我这样做是为了能够使用 gmock 模拟服务。 DI 实现在生产代码中工作,但是,我的测试设置有问题。 使用 EXPECT_CALL 宏时,出现“表达式必须具有 class 类型”错误。 我相信这与我设计依赖项的方式有关,但我找不到替代解决方案(缺乏经验)。 我已经浏览过以前关于类似问题的主题,但没有任何帮助。 您是否愿意看一下下面的代码并提示可能的解决方法(使用 Car-Engine 接口的简化代码示例)?

// Engine interface class with pure virtual functions
class IEngine
{
public:
    virtual ~IEngine() = default;
    virtual void start() = 0;
    virtual void stop() = 0;
};


// A V8Engine class implementing this interface
class V8Engine : public IEngine
{
public:
    void start() override { std::cout << "V8 Engine started\n"; };
    void stop() override { std::cout << "V8 Engine stopped\n"; };
};


// Car.h file
class Car
{
public:
    Car(IEngine *engineService);
    void Drive();
private:
    IEngine* mEngine = nullptr;
};


// Car.cpp file
Car::Car(IEngine* engineService)
    : mEngine(engineService)
{
    if (mEngine == nullptr)
    {
        throw std::invalid_argument("service must not be null");
    }
}

void Car::Drive()
{
    mEngine->start();
    mEngine->stop();
}

我希望能够模拟引擎实现,而不是使用“真正的 V8Engine”,而是利用模拟。 这是我设置测试的方式:

class MockEngine : public IEngine
{
public:
    MOCK_METHOD(void, start, (), (override));
    MOCK_METHOD(void, stop, (), (override));
};

TEST(TestCarClass, TestCarWithMockEngine)
{
    IEngine *mockEngine = new MockEngine;
    Car carUnderTest(mockEngine);
    carUnderTest.Drive();

    EXPECT_CALL(mockEngine, start()); // This is the part where I get the error due to invalid mockEngine setup
}

EXPECT_CALL期望模拟 object 作为第一个参数,您将引用传递给模拟。

要么使用*mockPtr

TEST(TestCarClass, TestCarWithMockEngine)
{
    IEngine *mockEngine = new MockEngine;
    Car carUnderTest(mockEngine);

    EXPECT_CALL(*mockEngine, start());

    carUnderTest.Drive();
}

或直接避免分配:

TEST(TestCarClass, TestCarWithMockEngine)
{
    MockEngine mockEngine;
    Car carUnderTest(&mockEngine);

    EXPECT_CALL(mockEngine, start());

    carUnderTest.Drive();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM