Неправильный порядок выполнения групп в 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, я ожидаю, что поток будет следующим:
- инициализировать все, прежде чем описать
- позвонить beforeGroup
- инициализировать описать тело, например, мой всякий раз, когда призывает насмехается
- запустить контекст
- запустить каждый метод it
Но я получаю следующий поток:
- инициализировать все, прежде чем описать
- запустить мое тело описания, например, мой всякий раз, когда призывает к издевательствам
- запустить контекст
- запустить beforeGroup
- запустить каждый метод 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
}
}
}
})