Spring boot 如何在SpringBootTest中使用KotlinBeans dsl初始值设定项
我有一个简单的应用程序,其中使用kotlin beans dsl声明了几个bean:Spring boot 如何在SpringBootTest中使用KotlinBeans dsl初始值设定项,spring-boot,kotlin,spring-boot-test,Spring Boot,Kotlin,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) } } @Re
@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
启动这个测试
UnsatisfiedDependencyException: Error creating bean with name appController
Caused by: NoSuchBeanDefinitionException: No qualifying bean of type 'A' available:`
似乎在springbootest
上下文创建期间未调用bean初始值设定项
我们需要在SpringBootTest中添加KotlinBeanDSL初始值设定项吗
@ContextConfiguration(initializers=…)
的一般方法在这里不起作用,因为它查找类。选项1
将FuBeansInitializer
添加到与测试目录中的App
类相同的包中
class FuBeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
override fun initialize(context: GenericApplicationContext) = beans.initialize(context)
}
因此,源文件中不会有任何修改。测试也可以正常工作。您甚至可以拥有多个
ApplicationContextInitializer
,并在属性中提供以逗号分隔的列表(顺序事项)。如果您在主代码中使用了初始值设定项,并且希望再次使用bean定义dsl覆盖一些bean,那么这将非常有用。您是否查看了?可能的重复项
class FuBeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
override fun initialize(context: GenericApplicationContext) = beans.initialize(context)
}
context.initializer.classes=path.to.FuBeansInitializer