C++ 使用依赖注入并用gmock模拟它

C++ 使用依赖注入并用gmock模拟它,c++,dependency-injection,googlemock,C++,Dependency Injection,Googlemock,我在代码中实现了依赖项注入模式。我这样做是为了能够使用gmock模拟服务。DI实现在生产代码中工作,但是,我的测试设置有问题。使用EXPECT_调用宏时,I get表达式必须具有类类型错误。我相信这与我设计依赖关系的方式有关,但我找不到缺乏经验的替代解决方案。我浏览了以前关于类似问题的帖子,但没有一个有用。请看一下下面的代码,并提示可能的解决方法使用汽车引擎接口的简化代码示例 // Engine interface class with pure virtual functions class

我在代码中实现了依赖项注入模式。我这样做是为了能够使用gmock模拟服务。DI实现在生产代码中工作,但是,我的测试设置有问题。使用EXPECT_调用宏时,I get表达式必须具有类类型错误。我相信这与我设计依赖关系的方式有关,但我找不到缺乏经验的替代解决方案。我浏览了以前关于类似问题的帖子,但没有一个有用。请看一下下面的代码,并提示可能的解决方法使用汽车引擎接口的简化代码示例

// 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();
}
EXPECT\u调用expected mock对象作为第一个参数,将引用传递给mock

使用*mockPtr:

或避免直接分配:

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

    EXPECT_CALL(mockEngine, start());

    carUnderTest.Drive();
}

EXPECT_调用应在测试carUnderTest.Drive.的代码之前调用,以避免不必要的新增:MockEngine mock;汽车与模拟;它将修复EXPECT_调用,该调用期望mock而不是mock上的指针。谢谢您的提示。当我使用NUnit在C中进行单元测试时,预期的调用总是在要测试的代码之后,因此会产生混乱。
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();
}