【问题标题】:How to use Kotlin beans dsl initializer in SpringBootTest如何在 SpringBootTest 中使用 Kotlin beans dsl 初始化程序
【发布时间】:2018-12-25 18:03:01
【问题描述】:

我有一个简单的应用程序,其中有几个用 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 = ...) 的一般方式在这里不起作用,因为它会查找类。

【问题讨论】:

标签: spring-boot kotlin spring-boot-test


【解决方案1】:

在测试目录下与App类在同一个包中添加FuBeansInitializer

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

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

    context.initializer.classes=path.to.FuBeansInitializer

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2020-05-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多