2

背景:我有两个扩展。一种是在任何测试开始之前创建一些所需的测试数据,另一种是保存所有失败测试的唯一标识符,以便以后可以重试。我注意到,如果第一个扩展引发异常,则第二个扩展永远不会执行,即使它实现了生命周期异常处理程序。

在对其进行了更多调查以查看两个扩展是否都已注册以及它们是否注册顺序不正确后,我得出结论,可能无法使用另一个扩展捕获一个扩展中抛出的异常,并且扩展只能捕获从测试类抛出的异常. 但真的是这样吗?我在 Junit5 用户指南中找不到任何明确的信息。

下面是 Kotlin 中的一个小代码示例,它演示了我的意思。

扩展:

class ExceptionThrowingExtension: BeforeAllCallback, LifecycleMethodExecutionExceptionHandler {

    @Throws(Throwable::class)
    override fun handleBeforeAllMethodExecutionException(context: ExtensionContext, throwable: Throwable) {
        println("[ExceptionThrowingExtension] handleBeforeAllMethodExecutionException")
        throw throwable
    }

    override fun beforeAll(context: ExtensionContext) {
        println("[ExceptionThrowingExtension] beforeAll")
        throw RuntimeException("test")
    }
}
class ExceptionCatchingExtension: LifecycleMethodExecutionExceptionHandler {

    @Throws(Throwable::class)
    override fun handleBeforeAllMethodExecutionException(context: ExtensionContext, throwable: Throwable) {
        println("[ExceptionCatchingExtension] handleBeforeAllMethodExecutionException")
        throw throwable
    }
}

测试类:

@ExtendWith(ExceptionCatchingExtension::class, ExceptionThrowingExtension::class)
class ExampleTest {
    @Test
    @Tag("debug")
    fun MyTest() {
        println("test")
    }
}

我希望我能看到handleBeforeAllMethodExecutionException至少在一次延期中被执行,但得到的只是:

[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.me.ExampleTest
[ExceptionThrowingExtension] beforeAll

我是否遗漏了某些东西,或者无法从该扩展或另一个扩展中捕获从扩展抛出的异常?

4

1 回答 1

0

查看 JUnit 源代码中如何调用 LifecycleMethodExecutionExceptionHandler.handleBeforeAllMethodExecutionException() 可以确认您的理解:无法在另一个扩展中处理由扩展引发的异常。当从扩展方法抛出异常时,它会一直向上传播到调用堆栈并终止测试执行。

于 2021-11-30T16:48:34.003 回答