如何在 Spek 测试中使用依赖注入



我正在使用Kotlin,Spring和Spek实现简单的微服务。我想测试我的存储库,但我想知道如何将存储库注入 spek 测试用例。每个示例或教程都基于创建新引用,如下所示:

object SampleTest : Spek({
    describe("a calculator") {
        val calculator = SampleCalculator()
        it("should return the result of adding the first number to the second number") {
            val sum = calculator.sum(2, 4)
            assertEquals(6, sum)
        }
        it("should return the result of subtracting the second number from the first number") {
            val subtract = calculator.subtract(4, 2)
            assertEquals(2, subtract)
        }
    }
})

总而言之,我不想这样做:

val calculator = SampleCalculator()

我想实现这个

@Autowired
val calculator: SampleCalculator

但我不能这样做,因为我无法将服务自动连接到局部变量。有什么解决方案吗?我是 kotlin 和 spek 的新手。

试试 lateinit:

@Autowired
lateinit var calculator: SampleCalculator

看看 GitHub 上的 spek-spring-extension 项目,有一种方法可以从 Spring 上下文中注入 bean:

斯佩克的弹簧扩展

这是在 Spek 中编写弹簧集成测试的概念证明

局限性

目前,仅支持注入 bean。

@ContextConfiguration(classes = arrayOf(MyConfiguration::class))
object MySpec: Spek({
    val context = createContext(MySpec::class)
    val foo = context.inject<Foo>()
    // val foo: Foo by context.inject()
    it("blah blah blah") {
        foo.doSomething()
    }
})

问题

Spring的TestContext框架对测试的结构进行了假设,这与Spek不兼容,这意味着我们不能使用TestContextManager(我们可以,但它会非常黑客化(。

最新更新