【问题标题】:How to mock OpenCV camera using GMock, or how test method that use camera with GTest?如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?
【发布时间】:2019-02-15 10:23:00
【问题描述】:
我已经为 OpenCV 库编写了一个包装器。我创建了允许使用硬件摄像头的Camera 类。
测试的方法是这样的:
bool Camera::Open(int idx) {
cam_ = cv::VideoCapture(idx)
if (cam_.isOpened())
return true;
return false;
}
我想用 GTest 测试Open() 方法,但我不想用真实的物理相机测试它。我认为最好的方法是使用 GMock,但我真的不知道如何模拟相机。
【问题讨论】:
标签:
c++
opencv
camera
googletest
gmock
【解决方案1】:
一种选择是为相机创建一个接口和一个工厂函数:
class ICam {
virtual bool isOpened() const = 0;
};
class ICamFactory {
virtual std::unique_ptr<ICam> VideoCapture(int idx) = 0;
};
然后,您的相机类由实现 ICamFactory 的 CamFactory 构造。在您的测试中,您可以创建一个返回 MockCam 的 MockCamFactory。然后,您可以对 MockCamFactory 和 MockCam 设置期望:
EXPECT_CALL(mockCamFactory, VideoCapture(idx))
.WillOnce(ReturnNew<MockCam>());
EXPECT_CALL(mockCam, isOpened())
.WillOnce(Return(true));
ASSERT_TRUE(camera.IsOpen(idx));
你真正的 Cam 类然后包装对 OpenCV 的调用。