【问题标题】:Junit5 verify if an exception was thrown during the executionJunit5 验证执行过程中是否抛出异常
【发布时间】:2021-02-25 15:18:36
【问题描述】:

在 JUnit5 中,我如何验证是否曾经抛出异常但后来在执行期间被捕获? 例如,考虑

public Optional<Foo> MethodA(Argument a)  {
try {
    /*
        Some logic based on Aargument a providing biproduct Argument b
    */

        methodB(b)

    /*
        some other logic capable of throwing exception
    */

    } catch(Exception e) {
        // log  exception
        return Optional.empty();
    }
}

private BReturnValue MethodB(Argument b) throws Exception{
    throw new IllegalStateException() 
}

现在无论哪种方法,无论 A 还是 B 抛出异常,作为 MethodA 的返回值,我都会收到一个空的 Optional,因此我不能使用 assertThrows() 但我实际上正在测试一个会导致 MethodB 的测试用例抛出异常。 我可以,如果可以,我如何验证在执行期间是否从MethodB 引发了异常?

注意

  • 目前我正在使用 2 个测试,一个用于验证是否返回了空 Optional,另一个用于通过手动提供 biproduct argument 并使用 assertThrows() 直接调用 MethodB()。

但我正在寻找更好的方法来验证 biproduct argument 是由 MethodA 形成的,并且 methodB 引发了异常。而且我不想直接测试MethodB,而是通过MethodA

【问题讨论】:

    标签: java junit junit5


    【解决方案1】:

    JUnit 无法检测抛出并捕获的异常。这需要分析执行情况,虽然在某些方面可能在技术上可行,但实施如此复杂的机制会适得其反。

    在这种情况下,我想知道为什么对抛出异常的测试很重要?在任何情况下,只要您的测试将 Optional.empty() 返回值视为失败的测试,测试就会失败,尽管它可能根本不应该捕获异常。在这种情况下,如果测试失败,您必须做额外的工作来确定出了什么问题,但您仍然得到了重要信息:出了问题。

    如果您觉得知道异常发生在哪里很重要,那么很可能应该单独测试这些方法,这需要重新设计/重构代码以更容易测试。

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 2016-09-21
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2015-11-14
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多