【问题标题】:Create an Abstract Spek for initializing shared objects with Kotlin and Spek使用 Kotlin 和 Spek 创建用于初始化共享对象的抽象 Spek
【发布时间】:2023-03-07 08:29:01
【问题描述】:

我正在尝试使用 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,我将在其中定义我的模拟等,然后在我的 Specs 中以某种方式继承或共享它。

有没有办法做到这一点?

【问题讨论】:

    标签: unit-testing kotlin spek


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多