@ParameterizedTest在@CvsSource中具有空值

在JUnit 4中编写参数化测试非常麻烦。 JUnit 5对框架进行了一些有用的改进,并且使用不同的参数运行相同的测试比以前的版本要简单得多。 但是,在这样的参数中传递空值存在一个小问题。

在这篇文章中,我将向您展示如何在JUnit 5中的@ParametrziedTest的@CvsSource和@ValueSource中传递null

1. @CsvSource中的空值

为了分析问题,我们需要一个示例案例。

假设我们创建了一个名为DateRange的类,其中包含一个时间段的两个边界日期。 仅当您将至少一个边界日期传递给构造函数时,才能创建新对象。 我们还需要确保开始日期早于结束日期。

使用JUnit 5中的@ParametrizedTest ,我们可以通过以下两个测试来描述给定的需求。

@ParameterizedTest
@CsvSource({
       "2017-06-01, 2018-10-15",
       "null, 2018-10-15",
       "2017-06-01, null"
})
void shouldCreateValidDateRange(LocalDate startDate, LocalDate endDate) {
   new DateRange(startDate, endDate);
}

@ParameterizedTest
@CsvSource({
       "2018-10-15, 2017-06-01",
       "null, null"
})
void shouldNotCreateInvalidDateRange(LocalDate startDate, LocalDate endDate) {
   assertThrows(IllegalArgumentException.class, () -> new DateRange(startDate, endDate));
}

但是,当您尝试执行这些测试时,最终将出现类似于以下所示的错误。

org.junit.jupiter.api.extension.ParameterResolutionException:转换索引0处的参数时出错:无法将字符串“ null”转换为java.time.LocalDate类型

尽管JUnit 5附带了许多内置的转换器,从字符串值到不同类型, 但是 @ValueSource或 @CsvSource中 不接受空值

那么,如何强制JUnit 5使用空文字呢?

2.自定义可为空的参数转换器

幸运的是,JUnit 5具有灵活性,我们可以轻松扩展其功能。

默认情况下,框架使用DefaultArgumentConverter类将String转换为其他类型。 我们的目标是将字符串“ null”表示为空文字。 其他字符串值应使用默认转换器进行转换。

为此,我们创建一个扩展SimpleArgumentConverter的类并实现其抽象的convert()方法。 在主体中,我们检查“空”值。 在其他情况下,我们执行默认转换器。

import org.junit.jupiter.params.converter.DefaultArgumentConverter;

public final class NullableConverter extends SimpleArgumentConverter {
   @Override
   protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
       if ("null".equals(source)) {
           return null;
       }
       return DefaultArgumentConverter.INSTANCE.convert(source, targetType);
   }
}

请注意, 自JUnit 5.2起,上面提供 DefaultArgumentConverter.convert() 的签名 就可用。

3.使用自定义参数转换器

准备好自定义转换器后,我们可以在测试中使用@ConvertWith批注对其进行调用。

@ParameterizedTest
@CsvSource({
       "2017-06-01, 2018-10-15",
       "null, 2018-10-15",
       "2017-06-01, null"
})
void shouldCreateValidDateRange(@ConvertWith(NullableConverter.class) LocalDate startDate,
                                @ConvertWith(NullableConverter.class) LocalDate endDate) {
   new DateRange(startDate, endDate);
}

结论

至此,您应该已经知道如何在JUnit 5参数源中接受空值以进行参数化测试。 我希望这种转换在框架的将来版本中将是自动的。 目前,我们需要一个小的解决方法。

如有任何疑问,请保留在评论中。 如果您想了解最新帖子,请关注我或加入订阅列表。

翻译自: https://www.javacodegeeks.com/2018/10/parameterizedtest-null-values-cvssource.html

可以@Cacheable注解来将方法的返回值放入缓存。如果方法的返回值为空,那么就无法将空值放入缓存。这是因为缓存通常是通过键值对的形式存储数据,如果方法返回的是空值,那么就没有可用的键值对来存储在缓存。所以,如果你希望将空值放入缓存,可以考虑使用一个特殊的非空值来代表空值,然后将这个非空值放入缓存。当从缓存获取数据时,如果返回的是这个非空值,就说明实际上是一个空值。这样就可以实现将空值放入缓存的需求了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [@Cacheable不会拦截该方法,缓存始终为空](https://blog.csdn.net/weixin_39793098/article/details/111721746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [springboot基础(37):spring缓存@Cacheable和@CacheEvict](https://blog.csdn.net/u011628753/article/details/125655183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值