java之 junit单元测试案例【经典版】
一 junit单元测试
1.1 单元测试作用
单元测试要满足AIR原则,即
A: automatic 自动化;
I: Independent 独立性;
R:Repeatable 可重复;
2.单元测试必须使用assert来验证
1.2 案例1 常规单元测试
1.代码
public class CalcDemo
{public int add(int x ,int y){return x + y;//return x * y;}public int sub(int x ,int y){return x - y;}
}
2.测试
public class AppTest {@Testvoid sub(){CalcDemo calcDemo = new CalcDemo();int retValue = calcDemo.sub(2, 2);assertEquals(0,retValue);System.out.println("");}
}
1.3 案例2 单元覆盖率Coverage*
1.代码
public class ScoreDemo
{public String scoreLevel(int score){if(score <= 0) {throw new IllegalArgumentException("缺考");} else if (score < 60) {return "弱";} else if (score < 70) {return "差";} else if (score <= 80) {return "中";} else if (score < 90) {return "良";} else {return "优";}}
}
2.测试
class ScoreDemoTest
{@Testvoid scoreLevel(){ScoreDemo scoreDemo = new ScoreDemo();assertEquals("弱",scoreDemo.scoreLevel(52));}@Testvoid scoreLevelv2(){ScoreDemo scoreDemo = new ScoreDemo();assertEquals("差",scoreDemo.scoreLevel(62));}@Testvoid scoreLevelv3(){ScoreDemo scoreDemo = new ScoreDemo();assertEquals("中",scoreDemo.scoreLevel(80));}@Testvoid scoreLevelv4(){ScoreDemo scoreDemo = new ScoreDemo();assertThrows(IllegalArgumentException.class,() -> scoreDemo.scoreLevel(-7));}
}

查看测试报告:对应覆盖率

1.4 案例3 BeforeEach,BeforeAfterall
1.代码
public class CalcDemo
{public int add(int x ,int y){return x + y;//return x * y;}public int sub(int x ,int y){return x - y;}
}
2.测试
class CalcDemoTestV2
{CalcDemo calcDemo = null;static StringBuffer stringBuffer = null;@BeforeAllstatic void m1(){stringBuffer = new StringBuffer("abc");System.out.println("===============: "+stringBuffer.length());}@AfterAllstatic void m2(){System.out.println("===============: "+stringBuffer.append(" ,end").toString());}@BeforeEachvoid setUp(){System.out.println("----come in BeforeEach");calcDemo = new CalcDemo();}@AfterEachvoid tearDown(){System.out.println("----come in AfterEach");calcDemo = null;}@Testvoid add(){assertEquals(5,calcDemo.add(1,4));assertEquals(5,calcDemo.add(2,3));}@Testvoid sub(){assertEquals(5,calcDemo.sub(10,5));}
}
3.结果

1.5 案例4 junit+反射+注解实现测试
1.定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AtguiguTest
{
}
2.定义调用类
public class CalcHelpDemo
{public int mul(int x ,int y){return x * y;}@AtguiguTestpublic int div(int x ,int y){return x / y;}@AtguiguTestpublic void thank(int x ,int y){System.out.println("3ks,help me test bug");}
}
3.定义测试类
@Slf4j
public class AutoTestClient
{public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException{//家庭作业,抽取一个方法,(class,p....)CalcHelpDemo calcHelpDemo = new CalcHelpDemo();int para1 = 10;int para2 = 0;Method[] methods = calcHelpDemo.getClass().getMethods();AtomicInteger bugCount = new AtomicInteger();// 要写入的文件路径(如果文件不存在,会创建该文件)String filePath = "BugReport"+ (DateUtil.format(new Date(), "yyyyMMddHHmmss"))+".txt";for (int i = 0; i < methods.length; i++){if (methods[i].isAnnotationPresent(AtguiguTest.class)){try{methods[i].invoke(calcHelpDemo,para1,para2);//放行} catch (Exception e) {bugCount.getAndIncrement();log.info("异常名称:{},异常原因:{}",e.getCause().getClass().getSimpleName(),e.getCause().getMessage());FileUtil.writeString(methods[i].getName()+"\t"+"出现了异常"+"\n", filePath, "UTF-8");FileUtil.appendString("异常名称:"+e.getCause().getClass().getSimpleName()+"\n", filePath, "UTF-8");FileUtil.appendString("异常原因:"+e.getCause().getMessage()+"\n", filePath, "UTF-8");}finally {FileUtil.appendString("异常数:"+bugCount.get()+"\n", filePath, "UTF-8");}}}}
}
4.查看结果

1.6 案例5 web工程单元测试
1.pom配置
<!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
2.处理类
@Service
public class MemberService
{public String add(Integer uid){System.out.println("---come in addUser,your uid is: "+uid);if (uid == -1){throw new IllegalArgumentException("parameter is negative。。。。");}return "ok";}public int del(Integer uid){System.out.println("---come in del,your uid is: "+uid);return uid;}
}
3.启动类
@SpringBootApplication
public class App
{public static void main( String[] args ){SpringApplication.run(App.class, args);System.out.println( "Hello World!" );}
}
4.测试类
@SpringBootTest
public class MemberTest {@Resource //真实调用,落盘mysql-MQ=redis。。。。测试条件充分的情况下private MemberService memberService1;// @Test
// void m1()
// {
// String result = memberService1.add(2);
// assertEquals("ok",result);
//
// System.out.println("----m1 over");
// }@MockBeanprivate MemberService memberService2;// @Test
// void m2_NotMockRule()
// {
// String result = memberService2.add(2);
// assertEquals("ok",result);
//
// System.out.println("----m2_NotMockRule over");
// }// @Test
// void m2_WithMockRule()
// {
// when(memberService2.add(3)).thenReturn("ok");//不真的进入数据库/MQ,不落盘,改变return
//
// String result = memberService2.add(3);
// assertEquals("ok",result);
//
// System.out.println("----m2_WithMockRule over");
// }
@SpyBean //有规则按照规则走,没有规则走真实
private MemberService memberService3;@Testvoid m3(){when(memberService3.add(2)).thenReturn("ok");String result = memberService3.add(2);System.out.println("----add result: "+result);Assertions.assertEquals("ok",result);int result2 = memberService3.del(3);System.out.println("----del result2: "+result2);Assertions.assertEquals(3,result2);//跨部门调用,不是写代码,累的是心,协调工作。 zzyybs@126.comSystem.out.println("----over");}
}
4.结果

相关文章:
java之 junit单元测试案例【经典版】
一 junit单元测试 1.1 单元测试作用 单元测试要满足AIR原则,即 A: automatic 自动化; I: Independent 独立性; R:Repeatable 可重复; 2.单元测试必须使用assert来验证 1.2 案例1 常规单元测试 1.…...
Golang面试题整理(持续更新...)
文章目录 Golang面试题总结一、基础知识1、defer相关2、rune 类型3、context包4、Go 竞态、内存逃逸分析5、Goroutine 和线程的区别6、Go 里面并发安全的数据类型7、Go 中常用的并发模型8、Go 中安全读写共享变量方式9、Go 面向对象是如何实现的10、make 和 new 的区别11、Go 关…...
uni-app:文字竖直排列,并且在父级view中水平竖直对齐
一、效果 二、代码 <template><view class"parent"><text class"child">这是竖直排列的文字</text></view> </template> <script>export default {data() {return {}},methods: {},}; </script> <sty…...
Linux 中停止 Docker 服务报 warning 导致无法彻底停止问题如何解决?
目录 问题 systemd Docker Service 和 Socket 警告的原因 解决方法 问题 使用如下命令停止 Docker # systemctl stop docker 执行后报的时候报了一个 warning,如下 Warning: Stopping docker.service, but it can still be activated by:docker.socket 这时…...
Git 用法
基本介绍 版本控制工具用处: 备份代码还原协同开发追溯 版本控制工具 1、集中式版本控制工具 版本库是集中存放在中央服务器的,team 里每个人 work 时从中央服务器下载代码,是必须联网才能工作,局域网或互联网。个人修改后然后…...
《昇思25天学习打卡营第20天|GAN图像生成》
生成对抗网络(GAN)是一种深度学习模型,用于生成逼真的图像。在手写数字识别的任务中,GAN 可以用来生成与真实手写数字相似的图像,以增强模型的训练数据集。GAN 主要由两个部分组成:生成器(Gener…...
【字幕】字幕特效入门
前言 最近两周调研了一下字幕特效的底层程序逻辑,因为工作内容的原因,就分享几个自己找的链接具体细节就不分享了,CSDN也是我的个人笔记,只记录一些简单的内容用于后续自己方便查询,顺便帮助一下正在苦苦查阅资料入门…...
Ubuntu 24.04安装Jellyfin媒体服务器图解教程
使用 Jellyfin 等开源软件创建媒体服务器肯定能帮助您管理和跨各种设备传输媒体集合。当你有一个封闭社区时,这尤其有用。 什么是 Jellyfin 媒体服务器? Jellyfin 媒体服务器,顾名思义,是一款开源软件,允许用户使用本…...
css3 中的伪类和伪元素
什么是伪类,什么是伪元素 伪类是用来添加特殊状态的选择器,它们以冒号(:)开头。伪类可以添加到任何现有的选择器上,用来选择处于特定状态的元素。 伪元素是用来选择元素的特定部分的选择器,它们以双冒号(::)开头。伪元素可以创建出在文档树中不存在的元素。 css3 …...
人工智能导论-知识图谱
知识图谱 概述 本章首先介绍“知识与知识表示”的概念,然后介绍“谓词逻辑、产生式、框架、语义网络”等当前人工智能中应用广泛的知识表示方法。然后,简要介绍知识图谱,为后面介绍推理方法、专家系统等奠定基础。 概述 - 起源(…...
LabVIEW液压数据采集测试系统
液压系统是装载机的重要组成部分,通过液压传动和控制实现各项作业功能,如提升、倾斜、转向等。液压系统的性能直接影响装载机的作业效率和稳定性。为了保证装载机液压系统的正常运行和优化设计,需要对其进行数据采集和测试。本文介绍了一套基…...
工业三防平板助力工厂生产数据实时管理
在当今高度数字化和智能化的工业生产环境中,工业三防平板正逐渐成为工厂实现生产数据实时管理的得力助手。这种创新的技术设备不仅能够在恶劣的工业环境中稳定运行,还为工厂的生产流程优化、效率提升和质量控制带来了前所未有的机遇。 工业生产场景通常充…...
LabVIEW人工模拟肺控制系统开发
开发了一种创新的主被动一体式人工模拟肺模型,通过LabVIEW开发的上位机软件,实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸,还能在被动模式下通过PID控制实现…...
达梦 ./disql SYSDBA/SYSDBA报错[-70028]:创建SOCKET连接失败. 解决方法
原因 达梦命令./disql SYSDBA/SYSDBA默认访问端口5236,如果初始化实例的时候修改了端口,需要指定端口访问 解决 ./disql SYSDBA/SYSDBA192.168.10.123:5237...
Autosar RTE配置-Assembly和Delegation的使用-基于ETAS软件
文章目录 前言Assembly和Delegation的含义Delegation的使用Assembly的使用总结 前言 RTE中的Compostion内部的SWC之间的连接使用Assembly Connector进行连接。这样的连接一般都是一个SWC的Pport对应另一个SWC的Rport。而Autosar软件中往往不只一个Composition(一般可以以核的数…...
【网络安全】PostMessage:分析JS实现XSS
未经许可,不得转载。 文章目录 前言示例正文 前言 PostMessage是一个用于在网页间安全地发送消息的浏览器 API。它允许不同的窗口(例如,来自同一域名下的不同页面或者不同域名下的跨域页面)进行通信,而无需通过服务器…...
liosam复现
写在前面: 本机系统ubuntu22.04dockernvidia docker的环境 本机系统已经安装好nvidia驱动和cuda 使用liosam提供的镜像在22.04下实在是无法兼容。 所以在rosnoetic(ubuntu20.04)下进行配置,本教程中rosnoetic:v3.2是在docker hub&…...
Flutter实战小案例
(实战)点不到的按钮 // 主要实现效果类 class _MyHomePageState extends State<MyHomePage> {// 1.定义要使用的变量double btnLeft 0;double btnTop 0;int timeDuration 500;String textButton "点我呀";// 2.获得当前设备屏幕尺⼨,需要impor…...
uniapp转小程序,小程序转uniapp方法
🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回&#…...
WPF中Frame
在Windows Presentation Foundation (WPF) 中,Frame 控件是一个非常重要的元素,主要用于实现页面导航和内容的动态加载。Frame 类似于网页开发中的iframe,但它是WPF应用程序中的一个容器,能够显示不同的页面或控件内容。 以下是F…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
