如何使用Junit5接收LocalDate类型的值作为测试参数
问题原因及修复方案
- 类型转换问题:Junit5参数化测试默认仅支持ISO标准格式(
yyyy-MM-dd)的字符串自动转为LocalDate,你使用的2020-2-2格式(月、日为单数字)需要手动指定转换规则;另外你定义的timeArrayProvider方法未被关联到测试方法,如果你要使用方法源需要替换注解。 - API使用错误:
Duration.between仅支持计算带时间精度的类型差值(如LocalDateTime、Instant),LocalDate属于日期精度类型,计算天数差需要用ChronoUnit.DAYS.between。
修复后的代码示例
方案1:保留@CsvSource的写法
给参数标注@JavaTimeConversionPattern指定匹配的日期格式即可:
import java.time.LocalDate; import java.time.temporal.ChronoUnit; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.converter.JavaTimeConversionPattern; import org.junit.jupiter.params.provider.CsvSource; @ParameterizedTest @CsvSource({"2020-2-2,2010-2-3"}) void t5_1(@JavaTimeConversionPattern("yyyy-M-d") LocalDate a, @JavaTimeConversionPattern("yyyy-M-d") LocalDate b) { long daysBetween = ChronoUnit.DAYS.between(a, b); System.out.println(daysBetween); }
补充:如果将
@CsvSource中的日期改为2020-02-02,2010-02-03这种ISO标准格式,不需要加@JavaTimeConversionPattern注解,Junit5默认支持自动转换。
方案2:使用你定义的方法作为参数源
直接在方法源中构造LocalDate实例,无需处理字符串转换:
import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @ParameterizedTest @MethodSource("timeArrayProvider") void t5_1(LocalDate a, LocalDate b) { long daysBetween = ChronoUnit.DAYS.between(a, b); System.out.println(daysBetween); } static Stream<Arguments> timeArrayProvider() { return Stream.of( Arguments.of(LocalDate.of(2020, 2, 2), LocalDate.of(2010, 2, 3)) ); }
内容的提问来源于stack exchange,提问作者user16838235
相关产品推荐
相关产品推荐

