Kotest嵌套测试中生命周期钩子执行顺序的疑问
Kotest嵌套测试场景下生命周期钩子执行顺序的疑问
我在使用Kotest 5.4.1版本时,对嵌套测试场景下的生命周期钩子执行顺序存在困惑,以下是测试示例代码:
import io.kotest.core.spec.style.DescribeSpec class KotestTest : DescribeSpec({ beforeSpec { println("beforeSpec") } afterSpec { println("afterSpec") } beforeAny { println("beforeAny") } afterAny { println("afterAny") } beforeContainer { println("beforeContainer") } afterContainer { println("afterContainer") } beforeEach { println("beforeEach") } afterEach { println("afterEach") } beforeTest { println("beforeTest") } afterTest { println("afterTest") } describe("1") { println("1") beforeAny { println("beforeAny 1") } afterAny { println("afterAny 1") } beforeContainer { println("beforeContainer 1") } afterContainer { println("afterContainer 1") } beforeEach { println("beforeEach 1") } afterEach { println("afterEach 1") } beforeTest { println("beforeTest 1") } afterTest { println("afterTest 1") } describe("2") { println("2") beforeAny { println("beforeAny 2") } afterAny { println("afterAny 2") } beforeContainer { println("beforeContainer 2") } afterContainer { println("afterContainer 2") } beforeEach { println("beforeEach 2") } afterEach { println("afterEach 2") } beforeTest { println("beforeTest 2") } afterTest { println("afterTest 2") } it("3") { println("3") } } } })
运行上述测试后,得到的执行输出如下:
beforeSpec beforeContainer beforeAny beforeTest 1 beforeContainer beforeContainer 1 beforeAny beforeAny 1 beforeTest beforeTest 1 2 beforeEach beforeEach 1 beforeEach 2 beforeAny beforeAny 1 beforeAny 2 beforeTest beforeTest 1 beforeTest 2 3 afterTest afterTest 1 afterTest 2 afterAny afterAny 1 afterAny 2 afterEach afterEach 1 afterEach 2 afterTest afterTest 1 afterAny afterAny 1 afterContainer afterContainer 1 afterTest afterAny afterContainer afterSpec
基于以上输出,我有两个疑问:
- 是否有官方明确规则,规定
beforeContainer、beforeAny、beforeTest,以及beforeEach、beforeAny、beforeTest的执行顺序? - 我理解
before类钩子是从外到内执行,但预期after类钩子应按相反顺序(从内到外)执行,当前的执行顺序是否属于Bug?
我们在项目中需要验证Mock调用,示例代码如下:
val mock = mockk<MyClass>() afterEach { confirmVerified(mock); clearMocks(mock); } describe("fun1") { beforeEach { every { mock.fun1()} returns 1 } afterEach { verify { mock.fun1()} } it("...") {...} }
但由于当前的执行顺序,外层的afterEach会先执行,导致内部的验证逻辑无法正常工作。
内容的提问来源于stack exchange,提问作者Björn Peemöller
相关产品推荐
相关产品推荐

