Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GMock:错误:无法转换‘;cv::MatExpr’;至‘;布尔’;作为回报_C++_Unit Testing_Opencv_Googletest_Gmock - Fatal编程技术网

C++ GMock:错误:无法转换‘;cv::MatExpr’;至‘;布尔’;作为回报

C++ GMock:错误:无法转换‘;cv::MatExpr’;至‘;布尔’;作为回报,c++,unit-testing,opencv,googletest,gmock,C++,Unit Testing,Opencv,Googletest,Gmock,上下文: 我试图使用GMock模拟OpenCV-C++类 问题: 对于接受cv::Mat并返回cv::Mat的函数,我无法使用EXPECT_调用方法。编译器说gmock匹配器不能作为交换从cv::MatExpr转换为bool 以下是编译期间的详细错误消息 In file included from /home/arun/Documents /LaneDetection/test/../vendor/googletest/googlemock/include/gmock/gmock-sp

上下文: 我试图使用GMock模拟OpenCV-C++类

问题:

对于接受cv::Mat并返回cv::Mat的函数,我无法使用EXPECT_调用方法。编译器说gmock匹配器不能作为交换从cv::MatExpr转换为bool

以下是编译期间的详细错误消息

In file included from /home/arun/Documents      /LaneDetection/test/../vendor/googletest/googlemock/include/gmock/gmock-spec-builders.h:75:0,
             from /home/arun/Documents/LaneDetection/test/../vendor/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h:43,
             from /home/arun/Documents/LaneDetection/test/../vendor/googletest/googlemock/include/gmock/gmock.h:61,
             from /home/arun/Documents/LaneDetection/test/test.cpp:32:
/home/arun/Documents/LaneDetection/test/../vendor    /googletest/googlemock/include/gmock/gmock-matchers.h: In instantiation of ‘bool     
testing::internal::AnyEq::operator()(const A&, const B&) const [with A = cv::Mat; B = cv::Mat]’:
/home/arun/Documents/LaneDetection/test/../vendor/googletest/googlemock/include/gmock/gmock-matchers.h:908:18:   
required from ‘bool testing::internal::ComparisonBase<D, Rhs, Op>::Impl<Lhs>::MatchAndExplain(Lhs, testing::MatchResultListener*) const [with Lhs = cv::Mat; D = testing::internal::EqMatcher<cv::Mat>; Rhs = cv::Mat; Op = testing::internal::AnyEq]’
/home/arun/Documents/LaneDetection/test/test.cpp:77:39:   required from here
/home/arun/Documents/LaneDetection/test/../vendor/googletest/googlemock/include/gmock/gmock-matchers.h:204:63: error: cannot convert ‘cv::MatExpr’ to ‘bool’ in return
   bool operator()(const A& a, const B& b) const { return a == b; }
                                                               ^
test/CMakeFiles/cpp-test.dir/build.make:86: recipe for target 'test/CMakeFiles/cpp-test.dir/test.cpp.o' failed
make[2]: *** [test/CMakeFiles/cpp-test.dir/test.cpp.o] Error 1
CMakeFiles/Makefile2:178: recipe for target 'test/CMakeFiles/cpp-test.dir/all' failed
make[1]: *** [test/CMakeFiles/cpp-test.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
测试.cpp

class Thresholder {
 public:

    Thresholder() {}
    virtual ~Thresholder() {} 
    virtual cv::Mat convertToLab(cv::Mat smoothImg);

 private:
    cv::Mat inputImg;   // < Container used for storing input image
    cv::Mat labImage;   // < Container for LAB converted input image
};
cv::Mat Thresholder::convertToLab(cv::Mat smoothImg) {
    inputImg = smoothImg;
    cv::cvtColor(inputImg, labImage, cv::COLOR_BGR2Lab);
    return labImage;
}
class MockThresholder : public Thresholder {
public:
    MOCK_METHOD1(convertToLab, cv::Mat(cv::Mat smoothImg));
};

/*
*@brief  : Creating test cases for mock class
*/

TEST(MockTest, ThreshTest) {
MockThresholder ThreshMock;
cv::Mat dummyXY = cv::Mat::ones(100, 100, CV_8UC3);
EXPECT_CALL(ThreshMock, convertToLab(dummyXY))
.Times(1)
.WillOnce(::testing::Return(dummyXY));}
问题:


似乎没有在线资源,说明如何有效地使用GMOCK使用OpenCV和C++。是否有可能共享一些如何测试C++类方法的演示,这些方法返回CV::Mat在GMOCK?

< P>这里的问题不是返回类型,而是预期调用。具体地说,
EXPECT\u调用(ThreshMock,convertToLab(dummyXY))
使GMock检查被调用的参数是否确实等于
dummyXY
。默认情况下,它使用
==
比较运算符

但是OpenCV将它们的比较声明为
cv::MatExpr操作符==(cv::Mat,cv::Mat)
。它返回布尔矩阵,而不是
bool

因此,您必须告诉GMock如何将您的预期调用与匹配。 您可以使用
MATCHER\u…
宏创建匹配器:

MATCHER_P(cvMatMatches, expected, "Match arg cvMat to be equal to expected") {
  if (arg.size() != expected.size()) {
    return false;
  }
  auto differingElems = (arg != expected);
  return cv::countNonZero(differingElems) == 0;
}
您的测试代码变成:

TEST(MockTest, ThreshTest) {
  MockThresholder ThreshMock;
  cv::Mat dummyXY = cv::Mat::ones(100, 100, CV_8U);
  EXPECT_CALL(ThreshMock, convertToLab(cvMatMatches(dummyXY)))
      .Times(1)
      .WillOnce(::testing::Return(dummyXY));

  ThreshMock.convertToLab(dummyXY);
}

这里的问题不是返回的类型,而是预期的调用。具体地说,
EXPECT\u调用(ThreshMock,convertToLab(dummyXY))
使GMock检查被调用的参数是否确实等于
dummyXY
。默认情况下,它使用
==
比较运算符

但是OpenCV将它们的比较声明为
cv::MatExpr操作符==(cv::Mat,cv::Mat)
。它返回布尔矩阵,而不是
bool

因此,您必须告诉GMock如何将您的预期调用与匹配。 您可以使用
MATCHER\u…
宏创建匹配器:

MATCHER_P(cvMatMatches, expected, "Match arg cvMat to be equal to expected") {
  if (arg.size() != expected.size()) {
    return false;
  }
  auto differingElems = (arg != expected);
  return cv::countNonZero(differingElems) == 0;
}
您的测试代码变成:

TEST(MockTest, ThreshTest) {
  MockThresholder ThreshMock;
  cv::Mat dummyXY = cv::Mat::ones(100, 100, CV_8U);
  EXPECT_CALL(ThreshMock, convertToLab(cvMatMatches(dummyXY)))
      .Times(1)
      .WillOnce(::testing::Return(dummyXY));

  ThreshMock.convertToLab(dummyXY);
}