问题描述
在使用 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