首页 > 解决方案 > GoogleTest:EXPECT_THROW 捕获不同的类型?

问题描述

我正在尝试测试 EXPECT_THROW,如下所示。

#include <gtest/gtest.h>
int Foo(int a, int b){
    if (a == 0 || b == 0){
        throw "don't do that";
    }
    int c = a % b;
    if (c == 0)
        return b;
    return Foo(b, c);
}
TEST(FooTest, Throw2){
    EXPECT_THROW(Foo(0,0), char*);
}
int main(int argc, char* argv[]){
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

我希望“Throw2”应该成功。但它给出了这个错误信息:

Expected: Foo(0,0) throws an exception of type char*.
Actual: it throws a different type.

那么这里抛出的类型是什么?

标签: c++testinggoogletestthrow

解决方案


"don't do that"是一个字符串文字,其类型是const char[14]. 因此,它只能衰减到 a const char*,而不是char*您期望的 a 。

所以修改你的测试EXPECT_THROW(Foo(0,0), const char*);应该让它通过。

顺便说一句,在这种情况下我不会抛出异常。IMO 最好简单地返回std::optional(或者boost::optional如果 C++17 不可用)。获得糟糕的输入并不是我认为足以保证例外的特殊情况。

如果我不得不抛出一个异常,那么抛出一个标准的异常类型比字符串文字加载更好。在这种情况下std::domain_error似乎合适。


推荐阅读