【发布时间】:2015-11-13 01:20:00
【问题描述】:
CPPUNIT_ASSERT_THROW(Expression, ExceptionType) 似乎不允许检查多种类型的异常,即检查可以抛出多种异常的语句。
例如表达式可能会在一个平台上抛出 Excp1,或者在另一个平台上抛出 Excp2。是否有使用 CPPUNIT_ASSERT_THROW 测试此类语句的解决方法?
【问题讨论】:
标签: c++ unit-testing throw cppunit
CPPUNIT_ASSERT_THROW(Expression, ExceptionType) 似乎不允许检查多种类型的异常,即检查可以抛出多种异常的语句。
例如表达式可能会在一个平台上抛出 Excp1,或者在另一个平台上抛出 Excp2。是否有使用 CPPUNIT_ASSERT_THROW 测试此类语句的解决方法?
【问题讨论】:
标签: c++ unit-testing throw cppunit
cppunit 中没有直接支持此功能,但您基本上有两种解决方案,您可以在代码中轻松实现它。
所以这个断言背后的基本思想是下面的代码:
bool expected_exception_thrown = false;
try
{
yourExpression();
}
catch(const ExpectedException&)
{
expected_exception_thrown = true;
}
catch(...)
{
}
if (!expected_exception_thrown)
CPPUNIT_FAIL();
当然,实际的实现有点花哨,并涉及一些额外的功能(比如更好的消息用于意外的 std::exception 和缺少对错误消息的支持),但总体思路是相同的。
因此,现在您可以轻松地扩展该模式以支持您需要的尽可能多的异常。您可以查看include/cppunit/TestAssert.h 中的现有实现,并使用该实现并对其进行扩展,或者使用我在上面发布的简化版本。
【讨论】:
第一个测试,您设置测试条件,使其抛出异常 1。 如果它没有抛出,那就是测试失败。 如果它确实抛出,你将它作为异常 1 捕获,并接受它作为传递。 如果它抛出了其他东西,框架就会捕获它。
第二个测试,您使用条件编译来启用仅适用于平台 2 的代码。您设置测试条件,使其引发异常 2。 如果它没有抛出,那就是测试失败。 如果它确实抛出,你将它作为异常 2 捕获,并接受它作为通过。 如果它抛出了其他东西,框架就会捕获它。
在第一个平台上测试只是通过了,因为它没有什么可做的。 在第二个平台上,您按预期捕获异常 2。
【讨论】: