=空值返回空值_@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 {@Overrideprotected 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

=空值返回空值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的配置文件_选项文件_参数文件

文章目录WindowsLinux使用命令 locate 查找含有关键词 my.cnf 的文件路径查看是否使用了指定目录下的 my.cnf 文件查看 MySQL 默认读取 my.cnf 文件路径启动时没有读取任何配置文件主要的配置参数类似于 Oracle 的参数文件&#xff0c;MySQL 的选项文件&#xff08;即配置文件&…

java url参数转换:_提示:通过URL激活并发送参数

java url参数转换:世界上最安全的密码是不存在的密码。 使用完全随机的密钥从等式中删除用户。 公平地说&#xff0c;这有一些缺点&#xff0c;并且密码仍然存在于某处&#xff08;在您的电话/电子邮件中&#xff09;&#xff0c;但通常这样效果很好... 诀窍很简单&#xff0c…

简单的vue入门案例

一、 简单入门Hello World案例 二、插值表达式 三、点击事件 四、按键事件 1.如果按下不是 0 - 9 则阻止事件执行 2.打印按下什么按键 五、鼠标事件 1.打印绝对坐标 2.打印相对坐标 3.鼠标mousemove 4. 阻止冒泡(阻止事件的传播) 六、事件修饰符 1.阻止跳转页面v-on:submit.…

javafx 调用java_Java,JavaFX的流畅设计风格进度栏

javafx 调用java按照承诺&#xff0c;刚刚发布的Java JavaFX主题JMetro版本4.6为进度栏带来了新样式。 进度栏有两种可能的状态&#xff1a;确定和不确定&#xff0c;新的JMetro版本针对这两种具有不同的样式。 在本文中&#xff0c;我还将详细介绍我在JMetro中遵守的一些API设…

vue基本用法

一、v-text与v-html.html v-html 可以解析标签&#xff0c;解析样式,v-text不能解析&#xff0c;只能原样输出 二、v-bind绑定参数 v-bind简写方式 <!-- 完整语法 --> <a v-bind:href"url">...</a> <!-- 缩写 --> <a :href"url&q…

类Unix系统下,vim各种模式之间的切换

文章目录普通命令模式插入模式&#xff08;编辑模式&#xff09;临时切换到普通命令模式可视模式&#xff08;文本选择模式&#xff09;底行命令模式&#xff08;EX 命令模式&#xff09;普通命令模式 vim 的默认模式就是普通命令模式&#xff0c; 使用 vim 打开文件就进入普通…

jdk12 switch_玩JDK 12的Switch表达式

jdk12 switch在博客文章“操作中的JDK语言功能预览&#xff1a;切换表达式 ”中&#xff0c;我讨论了JEP 325 [“切换表达式&#xff08; 预览 &#xff09;”&#xff09;如何作为指定的“ 预览语言功能 ”的早期应用&#xff0c;如JEP 12所述。预览语言和VM功能”]。 JEP 325…

VueJS生命周期

一、生命周期 vue在生命周期中有这些状态&#xff0c; beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed。Vue 在实例化的过程中&#xff0c;会调用这些生命周期的钩子&#xff0c;给我们提供了执行自定义逻辑的机会。 vue对象初始化过…

Linux的命令之 man -- 查看帮助文档

文章目录浏览文本内容的快捷键向前滚屏向后滚屏跳跃搜索使用这个命令可以查看任何命令的在线帮助文件&#xff0c;例如&#xff0c;查看命令 find 的在线帮助文档&#xff1a; [roothtlwk0001host ~]# man find打开命令的帮助文档后&#xff0c;可以使用鼠标滚轮上下滚动来浏览…

jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式

jdk8切换成jdk6JEP 12 [“预览语言和VM功能”]在其主页上描述如下&#xff1a; 预览语言或VM功能是Java SE平台的一项新功能&#xff0c;该功能已完全指定&#xff0c;完全实现但不是永久性的。 JDK功能发布中提供了该功能&#xff0c;以根据实际使用情况激发开发人员反馈。 这…

VueJS ajax综合案例

一、目录结构和注意事项 1.目录结构 2.注意事项 &#xff08;1&#xff09;data.html里面的Vue &#xff08;2&#xff09;箭头函数 二、引入依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0…

Linux 下如何查找 MySQL 数据库的数据根目录呢?

笔者的服务器系统和MySQL版本如下&#xff1a; [roothtlwk0001host ~]# mysql -V mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper [roothtlwk0001host ~]# cat /etc/redhat-release CentOS Linux release 8.2.2004 (Core) MySQL 的配置文件路径…

libreoffice_利用Excel或LibreOffice的业务输入进行单元测试约束

libreoffice业务专家向我们&#xff08;开发人员&#xff09;解释业务限制。 但是&#xff0c;如何确保我们正确理解它们呢&#xff1f; 或更糟糕的是&#xff0c;一旦约束条件正式化&#xff0c;我们如何测试他们之间是否同意&#xff1f; 好吧&#xff0c;有一种很棒的方法可…

VueJS ajax综合案例(修改用户信息实现步骤)

修改用户信息 1.过程演示 2.代码实现

MacOS下如何通过命令搜索文件和打开文件

文章目录find 命令查找名称含有指定关键词的文件和目录locate 命令查找以指定字符串结尾的文件路径查看命令 locate 的使用说明mdfind 命令查找名称中含有指定关键词的文件搜索内容中包含指定关键词的文件在指定目录中搜索内容包含指定关键词或者名称含有指定关键词的文件搜索并…

多云和混合云_多云互操作性!=云服务聚合

多云和混合云多云定义为一种方法&#xff0c;该方法将来自多个云供应商的多个云&#xff08;公共云或私有云&#xff09;组合在一起。 但是&#xff0c;这不是来自不同供应商的各种服务的集合&#xff0c;它需要一种强制性的胶合剂–云不可知的方法&#xff0c;并在所有提供商之…

安装、启动、配置zookeeper(window版)

安装zookeeper (1)解压安装包 &#xff08;2&#xff09;修改zoo_sample.cfg文件名为&#xff1a;zoo.cfg (3)在加压文件下建立data文件夹 &#xff08;4&#xff09;修改zoo.cfg (5)启动 注意如果zookeeper启动失败有可能是&#xff0c;第二步的zoo_sample.cfg文件名没改&…

命令终端(CMD)自动补全功能 — Tab Complete 功能

处理特殊字符 如果目录中有特殊字符&#xff08;空格&#xff0c;括号&#xff0c;引号&#xff0c;[]&#xff0c;!&#xff0c;$&#xff0c;&&#xff0c;*&#xff0c;;&#xff0c;|&#xff0c;\&#xff09;&#xff0c;必须使用特殊的语法来表示这些字符。例如&am…

自动驾驶行车记录仪训练集_无服务器安全性:将其置于自动驾驶仪上

自动驾驶行车记录仪训练集Ack &#xff1a;本文是从个人经验以及从无服务器安全性的其他多个来源学到的东西的混合。 我无法在这里列出或确认所有这些信息&#xff1b; 但是&#xff0c;应该特别感谢The Register &#xff0c; Hacker Noon &#xff0c; PureSec以及Serverless…

MySQL数据库模式(SQL_MODE)中的STRICT_TRANS_TABLES和STRICT_ALL_TABLES

-InnodbMyisamSTRICT_TRANS_TABLES无论插入单行或是多行&#xff0c;只要插入数据与字段类型不兼容&#xff0c;则insert操作失败并回滚插入单行数据与字段类型不兼容&#xff0c;则insert操作失败并回滚&#xff1b;插入多行数据&#xff0c;如果插入数据的第一行内容与字段类…