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



我已经在我的代码中实现了依赖注入模式。我这样做是为了能够使用gmock模拟服务。DI实现可以在生产代码中工作,但是,我的测试设置遇到了问题。当使用EXPECT_CALL宏时,表达式必须具有类类型。错误。我相信这与我设计依赖项的方式有关,但我找不到替代解决方案(缺乏经验)。我浏览了以前关于类似问题的帖子,但没有任何帮助。您是否愿意看一下下面的代码并提示可能的解决方法(使用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 startedn"; };
void stop() override { std::cout << "V8 Engine stoppedn"; };
};

// 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();
}

我希望能够模拟引擎实现,而不是使用"真正的v8引擎",而是利用模拟。下面是我设置测试的方法:

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期望mock对象作为第一个参数,您将引用传递给mock。

使用*mockEngine:

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();
}

最新更新