如何在 cppunit 中断言语句抛出 Excp1 或 Excp2 类型的异常?

How to assert in cppunit that a statement throws an exception either of type Excp1 or Excp2?

CPPUNIT_ASSERT_THROW(Expression, ExceptionType) 似乎不允许检查多种类型的异常,即可以抛出不止一种异常的语句。

对于 e.x。表达式可能会在一个平台上抛出 Excp1,或在另一个平台上抛出 Excp2。是否有使用 CPPUNIT_ASSERT_THROW 测试此类语句的解决方法?

在 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。