如何在 SpringBootTest 中使用 Kotlin beans dsl 初始化器
How to use Kotlin beans dsl initializer in SpringBootTest
我有一个简单的应用程序,其中包含几个使用 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
上下文创建期间未调用 beans 初始化程序。
我们需要在 SpringBootTest 中添加 kotlin bean dsl 初始化程序吗?
@ContextConfiguration(initializers = ...)
的一般方法在这里不起作用,因为它会查找 类。
将FuBeansInitializer
添加到与App
class同一个包中测试目录:
class FuBeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
override fun initialize(context: GenericApplicationContext) = beans.initialize(context)
}
将 context.initializer.classes
添加到测试中 application.properties:
context.initializer.classes=path.to.FuBeansInitializer
因此,源文件中不会有任何修改。并且测试会正常工作。
您甚至可以拥有多个 ApplicationContextInitializer
并在您的属性中提供以逗号分隔的列表(顺序很重要)。如果您在主代码中使用了 Initializer 并且想要再次使用 bean 定义 dsl 覆盖您的一些 bean,这将很有用。
我有一个简单的应用程序,其中包含几个使用 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
上下文创建期间未调用 beans 初始化程序。
我们需要在 SpringBootTest 中添加 kotlin bean dsl 初始化程序吗?
@ContextConfiguration(initializers = ...)
的一般方法在这里不起作用,因为它会查找 类。
将FuBeansInitializer
添加到与App
class同一个包中测试目录:
class FuBeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
override fun initialize(context: GenericApplicationContext) = beans.initialize(context)
}
将 context.initializer.classes
添加到测试中 application.properties:
context.initializer.classes=path.to.FuBeansInitializer
因此,源文件中不会有任何修改。并且测试会正常工作。
您甚至可以拥有多个 ApplicationContextInitializer
并在您的属性中提供以逗号分隔的列表(顺序很重要)。如果您在主代码中使用了 Initializer 并且想要再次使用 bean 定义 dsl 覆盖您的一些 bean,这将很有用。