c++ - 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.
那么这里抛出的类型是什么?
解决方案
"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
似乎合适。
推荐阅读
- spring - Spring WebFlux 和 MVC 配置在同一个库中
- javascript - 如何将搜索参数发送到 Flask 服务器?
- python - 检查用户名是否已经存在
- julia - 朱莉娅用希腊大写字母创建符号?
- c++ - C ++ valgrind错误消息分段错误
- javascript - How to make a search function with dropdown?
- ssl - Tomcat 使用单个 SSL 证书托管多个虚拟主机
- c++ - Ruby 模仿 C 整数数据类型和联合
- firebase - Firebase 调用 Google Cloud 函数问题 - 两个函数同名
- java - Java NIO 通道——数据去哪儿了?