创建抽象 Spek 以使用 Kotlin 和 Spek 初始化共享对象
Create an Abstract Spek for initializing shared objects with Kotlin and Spek
我正在尝试使用 Kotlin + Spek 框架编写单元测试。到目前为止看起来还不错,但我有一个问题,我必须编写大量样板代码,如果我想为一个 class 我正在测试的多个 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
}
})
我很想创建 'abstract' Spek,我将在其中定义我的模拟等,然后以某种方式在我的规范中继承或共享它。
有办法实现吗?
不幸的是,我没有找到制作 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
}
}
})
希望对遇到同样问题的人有用
我正在尝试使用 Kotlin + Spek 框架编写单元测试。到目前为止看起来还不错,但我有一个问题,我必须编写大量样板代码,如果我想为一个 class 我正在测试的多个 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
}
})
我很想创建 'abstract' Spek,我将在其中定义我的模拟等,然后以某种方式在我的规范中继承或共享它。
有办法实现吗?
不幸的是,我没有找到制作 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
}
}
})
希望对遇到同样问题的人有用