如何在SpringBootTest中使用Kotlin bean dsl初始化程序

时间:2018-07-17 23:25:50

标签: 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)
    }
}

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

class A

我有一个集成测试:

@RunWith(SpringRunner::class)
@SpringBootTest
class AppControllerTest {
    @Test
    fun dummyTest() {
        assert(true)
    }
}

启动此测试,我会得到

UnsatisfiedDependencyException: Error creating bean with name appController 
Caused by: NoSuchBeanDefinitionException: No qualifying bean of type 'A' available:`

似乎在SpringBootTest上下文创建期间未调用bean初始化程序。

我们需要在SpringBootTest中添加kotlin bean dsl初始化程序吗?

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

2 个答案:

答案 0 :(得分:1)

选项1

在测试目录中的FuBeansInitializer类的同一包中添加App

class FuBeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
    override fun initialize(context: GenericApplicationContext) = beans.initialize(context)
}

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

context.initializer.classes=path.to.FuBeansInitializer

因此,源文件中不会进行任何修改。测试会正常进行。

答案 1 :(得分:0)

您甚至可以拥有多个ApplicationContextInitializer,并在属性中提供逗号分隔的列表(顺序很重要)。如果您在主代码中使用了Initializer,并且想再次使用bean定义dsl覆盖某些bean,这将很有用。