用Kotlin和Spek创建一个抽象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,在那里我将定义我的模拟等,之后继承或分享我的规格。

有没有办法做到这一点?

不幸的是,我没有找到抽象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 } } }) 

希望对有同样问题的人有用