[英]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.