Kotlin Spek中的组执行顺序是错误的

这是我的测试:

object MySpek : Spek({ val myMock1: MyMock1 = mock() val myMock2: MyMock2 = mock() val handler = StartModeHandler(myMock1, myMock2) val session = mock<Session> { on { user }.doReturn(User.builder().withUserId("userId").build()) } describe("item exists for user") { beforeGroup { reset(digitalPointDao, trackDao) } whenever(myMock1.loadItem(session.user.userId)).thenReturn(Optional.of(MyItem())) whenever(myMock2.loadSomething()).thenReturn(ArrayList()) context("method onLaunch was called") { val response = handler.onLaunch(session) it("should return the response for existing user") { //some asserts here } it("should save the item") { //some mock verifies here } } } }) 

根据Spek的文档,我期望的流程如下:

  1. 初始化之前的所有内容
  2. 在组之前打电话
  3. 描述身体,例如我每当呼吁嘲笑
  4. 运行上下文
  5. 运行它的每个方法

但是我得到以下流程:

  1. 初始化之前的所有内容
  2. 运行我的描述机构,比如我每次打电话给模拟
  3. 运行上下文
  4. 在组之前运行
  5. 运行它的每个方法

我错过了什么,在这里做错了什么?

正如Spek文档中提到的组范围(给定,描述,上下文)将会急切地执行其中的任何代码。 任何测试状态初始化应该在灯具内完成(beforeEachTest,beforeGroup等)。 您也可以使用memoized来创建与Spek生命周期相关的依赖项。

 object MySpek: Spek({ val myMock1 by memoized { mock<myMock1>() } val myMock2 by memoized { mock<myMock2>() } val handler by memoized { StartModeHandler(myMock1, myMock2) } val session by memoized { mock<Session> { on { user }.doReturn(User.builder().withUserId("userId").build()) } } describe("item exists for user") { beforeEachTest { reset(digitalPointDao, trackDao) whenever(myMock1.loadItem(session.user.userId)).thenReturn(Optional.of(MyItem())) whenever(myMock2.loadSomething()).thenReturn(ArrayList()) } // use on instead of context on("method onLaunch was called") { val response = handler.onLaunch(session) it("should return the response for existing user") { //some asserts here } it("should save the item") { //some mock verifies here } } } })