junit单元测试:使用@ParameterizedTest 和 @CsvSource注解简化单元测试方法

        在平常的开发工作中,我们经常需要写单元测试。比如,我们有一个校验接口,可能会返回多种错误信息。我们可以针对这个接口,写多个单元测试方法,然后将其场景覆盖全。那么,怎么才能写一个测试方法,就将其涉及到的场景测试全呢?

        1:例如:有一个校验身份证号的接口,涉及业务场景:身份证号为空校验,身份证号是否正确。那么在单元测试的时候,需要测试身份证号为空的数据、身份证号格式错误的数据和身份证号格式正确的数据。

        2:业务代码实现:

package test.boot.service.impl;import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import test.boot.dao.StudentDao;
import test.boot.service.StudentService;
import test.boot.vo.StuentVO;@Service
public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentDao studentDao;public String checkIdNo(String idNo) {String regex = "^\\d{17}[0-9Xx]$";if (StringUtils.isBlank(idNo)) {return "身份证号为空";}if (idNo.matches(regex)) {return "身份证号格式正确";} else {return "身份证号格式错误";}}}

        3:涉及三种场景,单元测试怎么写呢?可能我们会写三个单元测试的方法,如下:

@Test
public void testCheckIdNoEmpty() {String result = new StudentServiceImpl().checkIdNo("");Assert.assertEquals("身份证号为空", result);
}
@Test
public void testCheckIdNoFormatSuc() {String result = new StudentServiceImpl().checkIdNo("666777199911112222");Assert.assertEquals("身份证号格式正确", result);
}
@Test
public void testCheckIdNoFormatError() {String result = new StudentServiceImpl().checkIdNo("345678889");Assert.assertEquals("身份证号格式错误", result);
}

        4:上述写法没有任何问题,如果我们需要测很多个接口,涉及到的业务场景有很多,那么看单元测试的时候,很难发现场景是否覆盖完全,那么我们是否可以优化为一个方法呢?如下:使用 @ParameterizedTest 和 @CsvSource 注解,@ParameterizedTest表示参数注册,也表示单元测试,@ParameterizedTest 和 @Test不能同时使用,@CsvSource 表示多参数注解,可以用分隔符分割数据。

        5:使用 @ParameterizedTest 和 @CsvSource 注解,可以用一个方法,即可测所有场景,我们可以传入两个参数,一个是身份证号,一个是预期结果。代码如下:

@ParameterizedTest
@CsvSource({"'', '身份证号为空'","'610222199911115511', '身份证号格式正确'","'61022219991111551X', '身份证号格式正确'","'6102221999111', '身份证号格式错误'"})
public void testCheckIdNo(String idNo, String expected) {StudentService studentService = new StudentServiceImpl();String result = studentService.checkIdNo(idNo);Assert.assertEquals(expected, result);
}

执行结果:

        不断的学习,才能让自己变得更好!美好的风景一直在路上,加油!

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

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

相关文章

业务项目中Echarts图表组件的封装实践方案

背景:如果我们的项目是一个可视化类/营销看板类/大屏展示类业务项目,不可避免的会使用到各种图表展示。那在一个项目中如何封装一个图表组件既能够快速复用、UI统一,又可以灵活扩充Echarts的各种复杂配置项配置就变得极为重要。 封装目标 符…

算法第十二天-矩形区域不超过K的最大数值和

矩形区域不超过K的最大数值和 题目要求 解题思路 来自[宫水三叶] 从题面来看显然是一道[二维前缀和]的题目。本题预处理前缀和的复杂度为O(m* n) 搜索所有子矩阵需要枚举[矩形左上角]和[矩形右下角],复杂度是 O ( m 2 ∗ n 2 ) O(m^2 * n^2) O(m2∗n2)&#xff0c…

【数据库原理】(5)关系数据库的关系数据结构

关系及相关概念 在关系模型中,无论是实体还是实体之间的联系均由关系(二维表)来表示。 1.域(Domain) 定义:域是一组具有相同数据类型的值的集合。例子:实数集合、整数集合、英文字母集合等。 2.笛卡儿积(Cartesian…

Spring之事务

当我们在某个方法上加了Transactional注解后,就表示该方法在调用时会开启Spring事务,而这个方法所在的类所对应的Bean对象会是该类的代理对象。 Spring事务的代理对象执行某个方法时的步骤: 1. 判断当前执行的方法是否存在Transactional注解…

mysql进阶-不同的count()性能

目录 一.count() 的含义 二.性能比较 三.结论 统计数据的四种count()方式包括:count(1) 、count(*)、count(id)、count(字段)。 假设数据库的存储引擎是InnoDB,如果是MyISAM,则表的总行数是已经存储的(没有where条件的情况下),可以直接返回。 一.cou…

YOLOv5改进 | 卷积篇 | SAConv轻量化的可切换空洞卷积(附修改后的C3+Bottleneck)

一、本文介绍 本文给大家带来的改进机制是可切换的空洞卷积(Switchable Atrous Convolution, SAC)是一种创新的卷积网络机制,专为增强物体检测和分割任务中的特征提取而设计。SAC的核心思想是在相同的输入特征上应用不同的空洞率进行卷积,并通过特别设计的开关函数来融合这…

2023-应用开发中遇到的问题与解决方案

随着科技的不断发展,应用开发已经成为了当今社会中不可或缺的一部分。无论是手机应用、网页应用还是桌面应用,它们都为我们的生活带来了极大的便利。然而,在应用开发的过程中,我们往往会遇到各种各样的问题。作者将针对应用开发过…

2024.1.5 Hadoop各组件工作原理,面试题

目录 1 . 简述下分布式和集群的区别 2. Hadoop的三大组件是什么? 3. 请简述hive元数据服务配置的三种模式? 4. 数据库与数据仓库的区别? 5. 简述下数据仓库经典三层架构? 6. 请简述内部表和外部表的区别? 7. 简述Hive的特点,以及Hive 和RDBMS有什么异同 8. hive中无…

平铺式桌面环境体验之I3WM

平铺式桌面环境体验之I3WM 一说到Linux桌面,大家常用的桌面环境可能是 GNOME、KDE或者Xfce(窗口可层叠),因为这几个流行的桌面环境更容易上手,更适合从Windows向Linux过渡。 但今天,我们来体验一种平铺式…

【SpringBoot】分组校验和自定义校验(注解)

分组检验 参数校验时,我们希望不同的方法参数校验规则不同,这时就需要分组校验。 public class Category {NotNull(groups Update.class)private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称// NotEmpty(groups {Add.class,…

java基础之Java8新特性-Stream(流)

简介 流(Stream)是 Java 8 引入的一种处理集合数据的抽象概念,它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道,可以对这些元素进行筛选、转换、排序、归约等操作,实现各种数据…

剑指offer题解合集——Week3day3

文章目录 剑指offerWeek3周三:树的子结构AC代码思路: 剑指offerWeek3 周三:树的子结构 题目链接:树的子结构 输入两棵二叉树 A,B,判断 B 是不是 A的子结构。我们规定空树不是任何树的子结构。数据范围 每…

【人工智能】深入了解人工智能的核心算法与应用实践

人工智能 学习AI要看的第一本书人工智能应当以人为本人工智能(第3版)通晓六点,明白人工智能是怎么回事基本概念和历史基础知识基于知识的系统高级专题现在和未来安全和编程 人工智能已经是基础学科 学习AI要看的第一本书 人工智能知识对于当…

Unix操作系统的前世今生

Unix是一种多用户、多任务操作系统,最初由AT&T贝尔实验室的肯汤普逊(Ken Thompson)和丹尼斯里奇(Dennis Ritchie)等人开发于上世纪70年代初。它被设计成一种通用的操作系统,支持跨多种硬件平台&#xf…

C++入门(详细解读,建议收藏)

🚩C是什么?🚩⛲🌟⚡🥦💬 C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危…

ssm基于Java Web的怀旧唱片售卖系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装怀旧唱片售卖系统软件来发挥其高效地信息处理的作用&#x…

计算机网络——网络中要解决的问题

1. 从网络管理的角度看 1.1 配置管理 追踪所有部署的硬件和软件资源,包括设备配置和软件版本。 1.2 故障管理​​​​​ 监控设备的运行状态,以确保所有组件都正常工作,以及快速响应和修复任何故障。 1.3 计费管理 监控资源消耗并进行计费…

使用FinalShell连接Linux系统

1.为什么要使用FinalShell连接Linux系统? 如果直接使用VMware上的Linux系统会有很多不方便: 内容的复制粘贴跨越VMware不方便文件的上传、下载跨越VMware不方便 也就是和Linux系统的各类交互,跨越VMware不方便 2.FinalShell下载 FinalSh…

【shell】bash script基础入门及例子(附代码)持续更新

A Bash script is a plain text file which contains a series of commands. Anything you can run normally on the command line can be put into a script ————https://ryanstutorials.net/bash-scripting-tutorial/bash-script.php Reference 教程:一篇教会…

RH850P1X芯片学习笔记-A/D Converter (ADCF)

文章目录 Features of RH850/P1x-C ADCFNumber of UnitsRegister Base AddressClock SupplyInterrupts and DMAHardware ResetExternal Input/Output SignalsVirtual Channel OverviewFunctional OverviewBlock DiagramPhysical Channels, Virtual Channels and Scan Groups Re…