spring-boot - 如何在 SpringBootTest 中使用 Kotlin beans dsl 初始化程序

标签 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 上下文创建期间未调用 beans 初始化程序。

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

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

最佳答案

FuBeansInitializer与test目录下的App类放在同一个包中:

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

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

    context.initializer.classes=path.to.FuBeansInitializer

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

关于spring-boot - 如何在 SpringBootTest 中使用 Kotlin beans dsl 初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391485/

相关文章:

spring-boot - Spring Boot Integration Test 在使用 Hibernate Search 时由于 lucene lock 而失败

java - Spring boot 测试 - 使用 2 个数据库时 EntityManager 不持久

java - Spring引导自动配置覆盖自定义(elasticsearchTemplate)配置

spring-boot - @SpringBootTest 注解导致 StackOverflowError

spring - 身份验证时Auth0:NoSuchMethodError

java - 如何在 Kotlin 中实现 Serializable 使其在 Java 中也能工作?

android - 如何捕捉到水平 RecyclerView 中 LinearSnapHelper 的特定位置?

Android WebView 仅在第一次失败

java - Mapstruct 更新值而不覆盖

java - Spring Boot 中单个资源使用 @RepositoryRestController 和 @RepositoryRestResource 的冲突