如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?

Posted

技术标签:

【中文标题】如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?【英文标题】:How to mock OpenCV camera using GMock, or how test method that use camera with 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,但我真的不知道如何模拟相机。

【问题讨论】:

【参考方案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 的调用。

【讨论】:

以上是关于如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gmock 模拟修改 C++ 类中的私有变量的成员函数?

GoogleTest中gMock的使用

gmock 如何指定不应该调用其他模拟方法?

如何通过openCV模拟鱼眼镜头效果?

如何在 OpenCV 中使用相机

gTest&gMock learning