【问题标题】:EXPECT_THROW - Actual: it throws a different type, google testsEXPECT_THROW - 实际:它抛出不同的类型,谷歌测试
【发布时间】:2017-02-22 23:21:32
【问题描述】:

大家好,我有这个构造函数

Matrix::Matrix(size_t row, size_t col)
{
  if(row < 1 || col < 1)
    throw new std::runtime_error("Minimalni velikost matice je 1x1");
  matrix = std::vector<std::vector< double > >(row,std::vector<double>(col, 0));
}

还有这个测试

Matrix *TestedMatrix;
EXPECT_THROW(TestedMatrix = new Matrix(-2,3),std::runtime_error );

但我仍然得到那个 exepction 是不同类型的。我也试过std::runtime_error*,但结果是一样的。一开始我想使用 EXPECT_ANY_THROW 但它没有显示在我的代码覆盖率中。感谢帮助 ! :)

【问题讨论】:

标签: c++ c++11 matrix googletest throw


【解决方案1】:

不要打电话给new

Matrix::Matrix(size_t row, size_t col)
{
  if(row < 1 || col < 1)
    throw std::runtime_error("Minimalni velikost matice je 1x1");
  matrix = std::vector<std::vector< double > >(row,std::vector<double>(col, 0));
}

new 将返回 void*,这就是为什么您会收到“异常属于不同类型”错误的原因。

【讨论】:

  • 是的,谢谢您的回复。问题是我无法更改代码。我只是在做测试,所以你知道如何通过调用 new 来解决这个问题吗?
  • 你能试试EXPECT_THROW(TestedMatrix = new Matrix(-2,3),void*);吗?
  • 不,它不起作用。我可以问你使用 Matrix *TestedMatrix 还是 Matrix Tested Matrix 是否更好。用指针测试更好,反之亦然。谢谢。
【解决方案2】:

假设size_tstd::size_t 的别名,您会在此处看到有符号到无符号的转换(并且您的编译器应该会警告您;检查您是否在构建中启用了足够的警告) .

-2 被转换为一个非常大的正值(非常接近 SIZE_MAX),因此构造函数很可能正在抛出 std::bad_alloc

您需要将0 传递给构造函数以执行引发std::runtime_error* 的代码路径。 (并且您可以将检查简化为if (!row || !col),因为 0 是唯一小于 1 的无符号值)。

EXPECT_THROW(Matrix(0,3), std::runtime_error*);
EXPECT_THROW(Matrix(3,0), std::runtime_error*);

顺便说一句,我建议您按值抛出,而不是使用new

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多