如何在 SpringBootTest 中使用 Kotlin beans dsl 初始值设定项

Ser*_*kin 2 kotlin spring-boot spring-boot-test

我有一个简单的应用程序,其中有几个用 kotlin beans dsl 声明的 bean:

@SpringBootApplication
class App

val beans = beans {
    bean<A>()
}

fun main(args: Array<String>) {
    runApplication<MatchmakerApp>(*args) {
        addInitializers(beans)
    }
}

@RestController
class AppController(val a: A) {
    // some code
}

class A
Run Code Online (Sandbox Code Playgroud)

我有一个集成测试:

@RunWith(SpringRunner::class)
@SpringBootTest
class AppControllerTest {
    @Test
    fun dummyTest() {
        assert(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

启动这个测试我得到

UnsatisfiedDependencyException: Error creating bean with name appController 
Caused by: NoSuchBeanDefinitionException: No qualifying bean of type 'A' available:`
Run Code Online (Sandbox Code Playgroud)

似乎在SpringBootTest创建上下文期间未调用 bean 初始值设定项。

我们需要在 SpringBootTest 中添加 kotlin bean dsl 初始值设定项吗?

一般的 with 方法@ContextConfiguration(initializers = ...)在这里不起作用,因为它寻找类。

Ser*_*kin 5

选项1

在测试目录中添加FuBeansInitializerApp类相同的包

class FuBeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
    override fun initialize(context: GenericApplicationContext) = beans.initialize(context)
}
Run Code Online (Sandbox Code Playgroud)

添加context.initializer.classes到测试 application.properties

context.initializer.classes=path.to.FuBeansInitializer
Run Code Online (Sandbox Code Playgroud)

因此,源文件中不会有任何修改。测试将正常工作。