JUnit 5 的扩展模型有十几种回调接口。它们在一个测试方法的生命周期里到底按什么顺序被调用?多个扩展叠在一起时谁先谁后?抛了异常的测试谁能拦住?这篇把每一次回调都打印出来。
Ext1.evaluateExecutionCondition(OrderTest)
Ext2.evaluateExecutionCondition(OrderTest)
Ext1.beforeAll
Ext2.beforeAll
@BeforeAll
OrderTest 构造器
Ext1.postProcessTestInstance
Ext2.postProcessTestInstance
Ext1.evaluateExecutionCondition(swallowed())
Ext2.evaluateExecutionCondition(swallowed())
Ext1.beforeEach(swallowed)
Ext2.beforeEach(swallowed)
@BeforeEach
Ext1.beforeTestExecution
Ext2.beforeTestExecution
Ext1.interceptTestMethod 之前
Ext2.interceptTestMethod 之前
测试方法体 swallowed:抛 IllegalStateException
Ext2.handleTestExecutionException(IllegalStateException)
Ext2.afterTestExecution
Ext1.afterTestExecution
@AfterEach
Ext2.afterEach
Ext1.afterEach
Ext2.TestWatcher.testSuccessful
Ext1.TestWatcher.testSuccessful
OrderTest 构造器
Ext1.postProcessTestInstance
Ext2.postProcessTestInstance
Ext1.evaluateExecutionCondition(passes(Greeting))
Ext2.evaluateExecutionCondition(passes(Greeting))
Ext1.beforeEach(passes)
Ext2.beforeEach(passes)
@BeforeEach
Ext1.beforeTestExecution
Ext2.beforeTestExecution
Ext1.resolveParameter(Greeting)
Ext1.interceptTestMethod 之前
Ext2.interceptTestMethod 之前
测试方法体 passes(收到 hi from Ext1)
Ext2.interceptTestMethod 之后
Ext1.interceptTestMethod 之后
Ext2.afterTestExecution
Ext1.afterTestExecution
@AfterEach
Ext2.afterEach
Ext1.afterEach
Ext2.TestWatcher.testSuccessful
Ext1.TestWatcher.testSuccessful
OrderTest 构造器
Ext1.postProcessTestInstance
Ext2.postProcessTestInstance
Ext1.evaluateExecutionCondition(skipMe())
Ext2.evaluateExecutionCondition(skipMe())
Ext1.TestWatcher.testDisabled(名字以 skip 开头)
Ext2.TestWatcher.testDisabled(名字以 skip 开头)
OrderTest 构造器
Ext1.postProcessTestInstance
Ext2.postProcessTestInstance
Ext1.evaluateExecutionCondition(fails())
Ext2.evaluateExecutionCondition(fails())
Ext1.beforeEach(fails)
Ext2.beforeEach(fails)
@BeforeEach
Ext1.beforeTestExecution
Ext2.beforeTestExecution
Ext1.interceptTestMethod 之前
Ext2.interceptTestMethod 之前
测试方法体 fails:抛 AssertionError
Ext2.handleTestExecutionException(AssertionError)
Ext1.handleTestExecutionException(AssertionError)
Ext2.afterTestExecution
Ext1.afterTestExecution
@AfterEach
Ext2.afterEach
Ext1.afterEach
Ext2.TestWatcher.testFailed(AssertionError)
Ext1.TestWatcher.testFailed(AssertionError)
@AfterAll
Ext2.afterAll
Ext1.afterAll
MethodSource [className = 'OrderTest', methodName = 'fails', methodParameterTypes = '']
=> java.lang.AssertionError: 真的失败
OrderTest.fails(OrderTest.java:9)
java.base/java.lang.reflect.Method.invoke(Method.java:580)
Ext1.interceptTestMethod(Ext1.java:9)
Ext1.interceptTestMethod(Ext1.java:9)
java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
4 containers found ] | 0 containers skipped ] | 4 containers started ] | 0 containers aborted ] | 4 containers successful ] | 0 containers failed ] | 4 tests found ] | 1 tests skipped ] | 0 tests aborted ] | 2 tests successful ] | 1 tests failed ]创建资源 root(根存储) 创建资源 class(类存储) 创建资源 method(a) beforeEach(a):子存储能读到父存储的 root 吗?true test a 关闭资源 method(a) 创建资源 method(b) beforeEach(b):子存储能读到父存储的 root 吗?true test b 关闭资源 method(b) @AfterAll 时:创建 4 个,已关闭 2 个(method 级的资源在每个测试结束时已关闭,class 与 root 级的还没有) 关闭资源 class(类存储) 关闭资源 root(根存储)
静态字段 @RegisterExtension.evaluateExecutionCondition(RegTest) 静态字段 @RegisterExtension.beforeAll 静态字段 @RegisterExtension.postProcessTestInstance Ext2.postProcessTestInstance 静态字段 @RegisterExtension.evaluateExecutionCondition(t(Greeting)) 实例字段 @RegisterExtension.evaluateExecutionCondition(t(Greeting)) Ext2.evaluateExecutionCondition(t(Greeting)) 静态字段 @RegisterExtension.beforeEach(t) 实例字段 @RegisterExtension.beforeEach(t) Ext2.beforeEach(t) 静态字段 @RegisterExtension.beforeTestExecution 实例字段 @RegisterExtension.beforeTestExecution Ext2.beforeTestExecution 静态字段 @RegisterExtension.resolveParameter(Greeting) 静态字段 @RegisterExtension.interceptTestMethod 之前 实例字段 @RegisterExtension.interceptTestMethod 之前 Ext2.interceptTestMethod 之前 测试方法体(收到 hi from 静态字段 @RegisterExtension) Ext2.interceptTestMethod 之后 实例字段 @RegisterExtension.interceptTestMethod 之后 静态字段 @RegisterExtension.interceptTestMethod 之后 Ext2.afterTestExecution 实例字段 @RegisterExtension.afterTestExecution 静态字段 @RegisterExtension.afterTestExecution Ext2.afterEach 实例字段 @RegisterExtension.afterEach 静态字段 @RegisterExtension.afterEach Ext2.TestWatcher.testSuccessful 实例字段 @RegisterExtension.TestWatcher.testSuccessful 静态字段 @RegisterExtension.TestWatcher.testSuccessful 静态字段 @RegisterExtension.afterAll