Spring @Value 注入转换在 @SpringJUnitConfig 测试中不起作用

问题描述

在使用 null 测试时,我找不到在注入 @Value 时进行自动值转换的方法

例如,对于给定的代码

@SpringJUnitConfig

给定的测试将失败:

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}

@Component
class ValueConvertInjection(@Value("2ms") val duration : java.time.Duration) {
    @postconstruct
    fun init() = println("Duration converted: $duration")
}

以下例外:

@SpringJUnitConfig(classes = [ValueConvertInjection::class])
class JUnitValueConvertInjectionTest {
    @Autowired
    lateinit var vi :ValueConvertInjection

    @Test
    fun test() = assert(vi.duration == Duration.ofMillis(2))
    
}

我找不到应该添加到上下文中的内容,因此将注册和选择任何 Spring 转换。

解决方法

Spring Boot 使用转换服务初始化上下文,这正是您所需要的:

public class ConversionConfiguration {
    @Bean
    fun conversionService() = ApplicationConversionService.getSharedInstance()
}

@SpringJUnitConfig(classes = [
        ValueConvertInjection::class,ConversionConfguration::class
]) {
class JUnitValueConvertInjectionTest {
    @Autowired
    lateinit var vi: ValueConvertInjection

    @Test
    fun test() = assert(vi.duration == Duration.ofMillis(2))   
}
,

要使用持续时间类,可以尝试如下

@Component
@ConfigurationProperties(prefix="time")
class ValueConvertInjection {
 
    Duration val = Duration.ofSeconds(60);

    @PostConstruct
    fun init() = println("Duration converted: $duration")
}

在你的 src/test/resources 中,创建 application.yml

time:
  val:
    2ms