Junit5 验证执行过程中是否抛出异常

Junit5 verify if an exception was thrown during the execution

在 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 的 return 值,我都会收到一个空的 Optional,因此我不能使用 assertThrows() 但我实际上是在测试一个测试导致 MethodB 抛出异常的情况。 我可以吗?如果可以,我如何验证在执行期间是否从 MethodB?

抛出异常

备注

但我正在寻找一些更好的方法来验证 biproduct argument 是由 MethodA 和 methodB 抛出异常形成的。而且我不想直接测试MethodB,而是通过MethodA.

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

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

如果您觉得了解异常发生的位置很重要,那么很可能应该单独测试这些方法,这需要 redesigning/refactoring 代码更易于测试。