EXPECT_THROW - 实际:它抛出不同的类型,google 测试

EXPECT_THROW - Actual: it throws a different type, google tests

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

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 );

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

不要打电话给 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 将 return 变为 void*,这就是为什么您会收到 "exception is of different type" 错误。

假设 size_tstd::size_t 的别名,您会在此处看到 signed-to-unsigned 转换(并且您的编译器应该警告您;检查您是否已启用您的构建中有足够的警告)。

-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.