Создание абстрактного Spek для инициализации общих объектов с помощью Kotlin and Spek

Я пытаюсь написать модульные тесты с помощью рамки Kotlin + Spek. До сих пор выглядит неплохо, но у меня есть проблема, что я должен написать много кода шаблона, если я хочу иметь несколько объектов Spec для одного класса, который я тестирую.

Это мой код, чтобы проиллюстрировать проблему:

object MyFirstSpec : Spek({ val myMock1: SomeObject1 = mock() val myMock2: SomeObject2 = mock() val myMock3: SomeObject3 = mock() val myMock4: SomeObject4 = mock() val myMock5: SomeObject5 = mock() val myMock6: SomeObject6 = mock() val myClass = MyClassToTest(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) given("something to test here") { //my test here } }) object MyOtherSpec : Spek({ val myMock1: SomeObject1 = mock() val myMock2: SomeObject2 = mock() val myMock3: SomeObject3 = mock() val myMock4: SomeObject4 = mock() val myMock5: SomeObject5 = mock() val myMock6: SomeObject6 = mock() val myClass = MyClassToTest(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) given("something else to test here") { // my test here } }) 

Мне бы хотелось создать «абстрактный» Spek, где я буду определять свои mocks и т. Д., И после этого наследовать или делиться им как-то по моим спецификациям.

Есть ли способ достичь этого?

К сожалению, я не нашел способ сделать Abstract Spek или наследование, но я нашел способ использовать Fixtures для достижения желаемых результатов.

Вот мой псевдо-код, демонстрирующий это:

 object MySpec: Spek({ describe("my tests with Fixtures") { val myMock1: SomeObject1 = mock() val myMock2: SomeObject2 = mock() val myMock3: SomeObject3 = mock() val myMock4: SomeObject4 = mock() val myMock5: SomeObject5 = mock() val myMock6: SomeObject6 = mock() val myClass = MyClassToTest(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) afterEachTest { reset(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) //or we can just clear invocations, if we don't want to reset the mocks //clearInvocations(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) } context("my first context for testing") { //initialization logic here specific for this context val somethingSpecificHere = MySpecificLogicObject() beforeEachTest { whenever(myMock1.doSomething()).thenReturn(someResult) } on ("calling the method i'm testing"){ myClass.myMethod(somethingSpecificHere) it ("should do what expected") { //verifies go here } } } context("my seconds context for testing") { //second context specific code } } }) , object MySpec: Spek({ describe("my tests with Fixtures") { val myMock1: SomeObject1 = mock() val myMock2: SomeObject2 = mock() val myMock3: SomeObject3 = mock() val myMock4: SomeObject4 = mock() val myMock5: SomeObject5 = mock() val myMock6: SomeObject6 = mock() val myClass = MyClassToTest(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) afterEachTest { reset(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) //or we can just clear invocations, if we don't want to reset the mocks //clearInvocations(myMock1, myMock2, myMock3, myMock4, myMock5, myMock6) } context("my first context for testing") { //initialization logic here specific for this context val somethingSpecificHere = MySpecificLogicObject() beforeEachTest { whenever(myMock1.doSomething()).thenReturn(someResult) } on ("calling the method i'm testing"){ myClass.myMethod(somethingSpecificHere) it ("should do what expected") { //verifies go here } } } context("my seconds context for testing") { //second context specific code } } }) 

Надеюсь, это будет полезно для кого-то, у кого была такая же проблема