GoogleTest:EXPECT_THROW 捕捉到不同的类型?
GoogleTest: EXPECT_THROW catches different type?
我正在尝试测试 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]
。因此,它只能衰减到 const char*
,而不是您期望的 char*
。
因此将您的测试修改为 EXPECT_THROW(Foo(0,0), const char*);
应该可以通过。
顺便说一句,在这种情况下我不会抛出异常。 IMO 最好简单地 return std::optional
(或者 boost::optional
如果 C++17 不可用)。收到错误的输入并不是我认为异常到足以保证例外的事情。
如果我必须抛出异常,那么抛出标准异常类型比字符串文字加载更好。在这种情况下 std::domain_error
似乎是合适的。
我正在尝试测试 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]
。因此,它只能衰减到 const char*
,而不是您期望的 char*
。
因此将您的测试修改为 EXPECT_THROW(Foo(0,0), const char*);
应该可以通过。
顺便说一句,在这种情况下我不会抛出异常。 IMO 最好简单地 return std::optional
(或者 boost::optional
如果 C++17 不可用)。收到错误的输入并不是我认为异常到足以保证例外的事情。
如果我必须抛出异常,那么抛出标准异常类型比字符串文字加载更好。在这种情况下 std::domain_error
似乎是合适的。