Неправильный порядок выполнения групп в 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. позвонить beforeGroup
  3. инициализировать описать тело, например, мой всякий раз, когда призывает насмехается
  4. запустить контекст
  5. запустить каждый метод it

Но я получаю следующий поток:

  1. инициализировать все, прежде чем описать
  2. запустить мое тело описания, например, мой всякий раз, когда призывает к издевательствам
  3. запустить контекст
  4. запустить beforeGroup
  5. запустить каждый метод it

Я что-то упускаю и делаю что-то здесь не так?

1 ответ

Решение

Как упомянуто в области документации группы Spek (дано, описано, контекст), будет охотно выполнять любой код внутри. Любая инициализация тестового состояния должна выполняться в фиксаторах (beforeEachTest, beforeGroup и т. Д.). Вы также можете использовать memoized создать зависимость, привязанную к жизненному циклу Спека.

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
            }
        }

    }
})
Другие вопросы по тегам