【问题标题】:How to assert in cppunit that a statement throws an exception either of type Excp1 or Excp2?如何在 cppunit 中断言语句抛出 Excp1 或 Excp2 类型的异常?
【发布时间】:2015-11-13 01:20:00
【问题描述】:

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

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

【问题讨论】:

    标签: c++ unit-testing throw cppunit


    【解决方案1】:

    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 中的现有实现,并使用该实现并对其进行扩展,或者使用我在上面发布的简化版本。

    【讨论】:

      【解决方案2】:

      第一个测试,您设置测试条件,使其抛出异常 1。 如果它没有抛出,那就是测试失败。 如果它确实抛出,你将它作为异常 1 捕获,并接受它作为传递。 如果它抛出了其他东西,框架就会捕获它。

      第二个测试,您使用条件编译来启用仅适用于平台 2 的代码。您设置测试条件,使其引发异常 2。 如果它没有抛出,那就是测试失败。 如果它确实抛出,你将它作为异常 2 捕获,并接受它作为通过。 如果它抛出了其他东西,框架就会捕获它。

      在第一个平台上测试只是通过了,因为它没有什么可做的。 在第二个平台上,您按预期捕获异常 2。

      【讨论】:

      • 您可以通过设置相同的测试条件并尝试捕获异常 2 来使平台 1 上的 test2 稍微好一点。如果是,则表示测试失败。
      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 2017-03-09
      • 2011-08-06
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多