You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:18:03