Java单元测试总结

article/2025/9/11 0:47:43

[版权申明] 非商业目的注明出处可自由转载
博文地址:
出自:shusheng007

文章目录

  • 概述
  • 单元测试概念
  • 测试项目
  • 单元测试工具
    • JUnit
    • Mockito
  • SpringBoot测试
  • 总结

概述

关于为什么要做单元测试是老生常谈了,越是小公司越不重视单元测试,这是实践出来的最经济的做法。由于大部分人在小公司工作,所以单元测试从来就没有被真正的重视起来过。大部分时候你写单元测试,不是你觉得它有用而是因为公司要求写。由于大公司部门以及项目协作很复杂,加上人力物力相对富裕,所以勉强可以推行下去,小公司这么搞就是在找死!

本人最近被迫写了很多单元测试,所以在此总结一下相关的知识点,留作笔记

本文基于SpringBoot项目

单元测试概念

我们首先要清楚的理解什么是单元测试?那个单元是啥?在Java中那个单元一般指一个类,也就是说我们的测试是着眼于单个类的,而不是一个流程.

例如有如下代码:

public Class1{private Class2 c2;...public void method1(){...String result = c2.method2();}
}

Class1依赖Class2,我们要给Class1写unit test的时候怎么办呢?因为UT的思想是看当前单元的功能是否正常而不管其他单元。对应到这里的话就是,Class1的UT只测试Class1的方法method1是否正常工作,而不管Class2的方法method2的情况。如果你要管Class2的方法那就没头了,因为它也可能依赖其他类,以此类推,无穷无尽,最后就变成集成测试了。

因为Class1的method1方法调用了Class2的方法,你不管怎么运行的通呢?答案就是Mock,让其按照我们的预期值通过。当然我们可以自己mock, 也可以使用框架帮助我们,这块Mockito开源库是当之无愧的扛把子。

测试项目

建立一个springboot的maven项目后,其会自动生成单元测试目录,如下所示

在这里插入图片描述
系统会生成一套与代码一致的测试目录结构

spring boot会自动引入测试相关的依赖如下

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

spring-boot-starter-test 会引入各种类库,其中就包括Junit和 Mockito。

单元测试工具

工欲善其事必先利其器,在Java的单元测试领域主流工具为JUnit与Mockito。JUnit 负责写单元测试业务逻辑,Mockito负责mock依赖。

JUnit

JUnit 已经发展到了JUnit5,所以我们只记录JUnit5的用法。

JUnit5 包含3个部分:

  • JUnit Platform: 用于JVM上启动测试框架的基础服务,提供命令行,IDE和构建工具等方式执行测试的支持。

  • JUnit Jupiter:包含 JUnit 5 新的编程模型和扩展模型,主要就是用于编写测试代码和扩展代码。

  • JUnit Vintage:用于在JUnit 5 中兼容运行 JUnit3.x 和 JUnit4.x 的测试用例。

编码相关的由 JUnit Jupiter 负责。

写使用JUnit写单元测试非常简单,IDEA 内部甚至集成了JUnit,可以直接生成。

例如我们有如下代码需要写单元测试

public class Programmer {private final String content ="码字如飞";public String program(){return content;}
}public class Company {private Programmer programmer;public Company(Programmer programmer) {this.programmer = programmer;}//计算测试与程序员的总人数public int getTotalStuff(int testers, int programmers){if(testers<0||programmers<0){throw new InvalidParameterException("不可为负数");}return testers + programmers;}//开始项目,依赖Programmerpublic void startProject(){System.out.println("开始项目");System.out.println(programmer.program());}
}

如果你使用IDEA的话,光标停在类名称上,点击Alt+Enter键,弹出菜单后选择Create Test,如下所示:

在这里插入图片描述
然后勾选上你要进行单元测试的方法,点击Ok按钮,IDEA就为你在相应的位置生成了单元测试的骨架代码。
在这里插入图片描述
生成的代码如下:

class CompanyTest {@BeforeEachvoid setUp() {}@AfterEachvoid tearDown() {}@Testvoid getTotalStuff() {}@Testvoid startProject() {}
}
  • @Test 表示那是一个单元测试方法
  • @BeforeEach 此方法在每个测试方法执行前都会执行
  • @AfterEach 此方法在每个测试方法执行后都会执行

JUnit 还有很多其他注解,我们接下来会讲到几个。

走到这一步立刻就会遇到另一个问题,单元测试测什么啊?单元测试的目的是验证你那个方法在各种情况下是否正常工作。一般可以分为算法测试和结果测试,算法测试是看你的方法是否按照预期的执行步骤执行了,而结果测试是看你的方法在给定输入时最终的输出是否符合预期。

如果你的代码写的比较垃圾,一个方法承担了特别多的职责,里面到处是逻辑分支,那么你这个方法进行算法测试就会非常空难,因为你要验证各个分支是否正常工作。

我们接下来尝试为下面的方法书写单元测试

public int getTotalStuff(int testers, int programmers){if(testers<0||programmers<0){throw new InvalidParameterException("不可为负数");}return testers + programmers;
}

对于上面的方法,我们一般会验证两个地方。第一档参数不合法时候的情况,第二相加结果。

class CompanyTest {private Company company;@BeforeEachvoid setUp() {System.out.println("每个方法之前执行");company = new Company(new Programmer());}@Testvoid getTotalStuff_InvalidParam() {int tester = -1;int programmer = 5;Assertions.assertThrows(InvalidParameterException.class, () -> company.getTotalStuff(tester, programmer));}@DisplayName("获取员工数成功方法")@Testvoid getTotalStuff_Success() {int tester = 1;int programmer = 5;Assertions.assertEquals(6, company.getTotalStuff(tester, programmer));}@Disabled@Testvoid startProject() {System.out.println("startProject");}
}

@DisplayName("获取员工数成功方法") 将修改测试方法在测试报告中的名称,如下图所示。通过@Disabled可以屏蔽某个测试方法。
在这里插入图片描述

JUnit 提供了Assertions类,里面有很多断言的静态方法,例如本例中断言抛异常和相等的方法。

关于JUnit更进一步的使用,这里推荐一个非常好的教程 Unit Testing with JUnit 5 - Tutorial

Mockito

Mockito一般都会伴随着JUnit出现,那么不使用Mockito可以完成UT吗?当然可以。如果不可以的话在没有Mockito的时候人们怎么办呢?只是因为用了它使生活变的更简单了。

例如本例,我们需要一个Company的对象怎么办呢?只能自己mock一个,使用Mockito的话就它就可以帮我们mock了,如下图:

@ExtendWith(MockitoExtension.class)
class CompanyTest {@Mockprivate Programmer programmer;@InjectMocksprivate Company company;@BeforeEachvoid setUp() {System.out.println("每个方法之前执行");
//        company = new Company(new Programmer());}...
//    @Disabled@Testvoid startProject() {System.out.println("startProject");Mockito.when(programmer.program()).thenReturn("码字如飞");company.startProject();}
}

@ExtendWith(MockitoExtension.class)是JUnit5的一个扩展,使用了这个就可以直接使用@Mock去mock字段了。上面还出现了一个@InjectMocks,它的作用是将其修饰的类所依赖的mock的对象直接注入,例如

Company 依赖Programmer,我们通过@Mock mock了一个programmer对象,通过@InjectMocks 将programmer注入到了campony里。

然后我们使用了Mockito的when.thenReturn方法mock了programmer的program方法,使程序不至于真的去调用programmer的program方法。

关于Mockito的进一步学习,推荐Unit tests with Mockito - Tutorial

SpringBoot测试

SpringBoot 提供了一套可以启动Spring 容器的测试框架(@SpringBootTest),不到必要时候不要使用,太慢。不过当我们要测试Controlor时就需要这种方式了。

总结

虽然单元测试看起来比实际上有用,但仍然属于高级程序员应该掌握的知识。为什么大公司需要单元测试呢?因为参与项目的人员多,部门之间交流相当困难,还存在大量菜逼程序员,时不时会遇到狗屎一样的代码… 有了单元测试至少可以快速的发现你动了程序要死给你看的那个地方…。

暂时就说这么多吧,本文主要从宏观方面阐述了单元测试的一些方面… 等有精力整理一份具体的使用案例,不过意义不大,一则可以看官网,二则网上类似文章已经很多。

GitHub源码地址:springboot-learn


http://chatgpt.dhexx.cn/article/ffXmTBG5.shtml

相关文章

java单元测试junit

进行单元测试则需要添加junit的依赖&#xff1a; ##JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck. ##对于java来说JUnit是一个单元测试的框架<dependency><groupId>junit</groupId><artifactId>junit</arti…

Java 单元测试

什么是单元测试 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证&#xff0c;简单来说就是测试部分代码&#xff0c;对代码中的问题快速定位&#xff0c;及时修复。 什么是JUnit JUnit就是一个Java语言的单元测试框架…

JAVA基础之单元测试

目录 1、单元测试介绍 2、环境搭建 2.1 JUnit 4 2.2 JUnit 5 3、快速上手 3.1 JUnit 4 3.2 JUnit 5 1、单元测试介绍 单元测试就是针对最小的功能单元编写测试代码&#xff0c;Java程序最小的功能单元是方法&#xff0c;因此&#xff0c;单元测试就是针对Java方法的测试…

Java基础单元测试

本篇博文目录: 1.单元测试(1) 测试Java方法(原生) 2. JUnit 5(1) JUnit 5简单使用的例子(2) JUnit5常用注解(3) JUnit5常用注解的使用(4).JUnit5内置断言 1.单元测试 单元测试就是针对最小的功能单元编写测试代码。Java程序最小的功能单元是方法&#xff0c;因此&#xff0c;对…

如何进行Java 单元测试

一、概述 Java 单元测试是指对软件中的最小可测试单元进行测试&#xff0c;以保证代码的质量和正确性&#xff0c;并且可以加速开发过程。本文将全面详细地介绍 Java 单元测试相关知识点&#xff0c;包括单元测试的定义、优点和流程、JUnit 测试框架、Mockito 框架、持续集成、…

Java之单元测试(JUnit单元测试框架)

一、概述 单元测试就是针对最小的功能单元编写测试代码&#xff0c;Java程序最小的功能单元是方法&#xff0c;所以单元测试就是针对Java方法的测试&#xff0c;进而检查方法的正确性。常规测试有什么问题&#xff1f; 只有一个main方法&#xff0c;如果一个方法的测试失败了…

(60)Java基础 --单元测试

目录 一、测试的概念 二、使用Junit4.x进行单元环境 1、环境搭建 2、使用步骤 3、常见注解 三、规范的Junit测试方式 四、断言 1、为什么要使用断言 2、什么是断言(猜测) 3、常用API 一、测试的概念 先认识到测试的重要性&#xff1a;优秀的软件不是开发出来的,而是…

微信小程序消息推送(订阅消息原模板消息)开发流程

注&#xff1a;模板消息没了。 正常开发肯定需要前后端配合&#xff0c;此处都在小程序里写了 参考文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html 订阅消息是个很好的功能&#xff0c;但是现在被不良商家…

小程序之模版消息通知

手把手教你开发微信小程序之模版消息通知 一、模板消息功能概述 模板推送位置&#xff1a;服务通知 模板消息效果展示图&#xff1a; 进入小程序通知&#xff1a; 二、开发前的配置准备 1、验证token是否有效 <?php/*** 验证*/public function valid(){$echoStr $_GET…

java 微信小程序-发送模板消息

开发前准备工作 登录微信公众平台-小程序后台&#xff0c;在模板消息里面设置需要发送的模板&#xff0c;拿到模板id。 地址&#xff1a; https://mp.weixin.qq.com 找到微信官方文档-小程序开发-下发小程序和公众号统一的服务消息接口。 地址&#xff1a; https://developers…

【微信小程序】模板消息推送(测试成功)。

note&#xff1a; 这几天想做微信小程序消息推送的功能&#xff0c;然后在网上找了好多教程&#xff0c;都没解决问题&#xff0c;官方文档写的教程由不够详细&#xff0c;所以走了好多弯路。 现在问题解决了&#xff0c;记录一下。 我在网上找的好多教程都不详细&#xff0c;虽…

微信小程序模板订阅消息推送

尚未接触这块之前&#xff0c;以为是比较麻烦的&#xff0c;经研究并实现后&#xff0c;大致可以分为三个阶段&#xff1a; 申请模板&#xff08;明确推送卡片的格式及内容&#xff09;前端订阅&#xff08;打开可推送开关&#xff0c;允许推送&#xff09;后端推送&#xff0…

微信小程序——发送模板消息

步骤一&#xff1a;获取模板ID 1、通过模版消息管理接口获取模版ID&#xff08;详见模版消息管理&#xff09; 2、在微信公众平台手动配置获取模版ID 登录 https://mp.weixin.qq.com 获取模板&#xff0c;如果没有合适的模板&#xff0c;可以申请添加新模板&#xff0c;审核通…

微信小程序的模板消息与小程序订阅消息

小程序订阅消息功能介绍消息能力是小程序能力中的重要组成&#xff0c;我们为开发者提供了订阅消息能力&#xff0c;以便实现服务的闭环和更优的体验。 订阅消息推送位置&#xff1a;服务通知订阅消息下发条件&#xff1a;用户自主订阅订阅消息卡片跳转能力&#xff1a;点击查…

《微信小程序——发送模板消息》详细步骤

第一步&#xff1a;获取access_token 第一步详情&#xff1a;因为access_token在微信公众号还是小程序&#xff0c;在一个月之内都有获取次数的限制&#xff0c;并且一个access_token只有2小时的有效期&#xff1b;所以每当我们获取一次access_token,就要反复利用&#xff1b;…

微信小程序给公众号发送模板消息

参考文献&#xff1a;小程序如何向公众号推送消息_fbbqt的博客-CSDN博客_小程序给公众号发信息小程序如何向公众号推送消息https://blog.csdn.net/fbbqt/article/details/122167097 前置条件&#xff1a; 微信公众号:AppId和APPSecret(必须认证) 微信小程序:AppId和APPSecret…

微信小程序模板消息实现(PHP+小程序)

参考官方文档和部分资料&#xff0c;总结小程序模板消息推送以及相关注意事项&#xff0c;楼主踩过的坑&#xff0c;特来与大家分享。 一、开发准备&#xff1a; 1. 在微信公众平台 - 小程序的模板中心申请消息模板 二、实现原理&#xff1a; 文档示例&#xff1a;小程序 接…

微信小程序订阅模板消息

1.登录管理员后台&#xff0c;订阅消息&#xff0c;选择模板或者申请模板 2. 开发管理&#xff0c;开发设置&#xff0c;开启消息推送&#xff0c;并验证服务器 3. 开发获取获取模板列表接口&#xff0c;和 测试消息发送接口 4. 前端根据接口配置授权弹窗页&#xff0c;获取用…

微信小程序|如何设置模板消息提醒

管理员如何设置模板消息提醒&#xff0c;管理员如何查看。回复用户咨询信息 使用管理员模板消息提醒&#xff0c;首先配置模板消息 第一步&#xff0c;设置模板消息&#xff0c;配送员通过微信模板消息接收配送信息&#xff0c;需要在平台——微信公众号——模板消息设置&#…

小程序之模板消息

使用模板消息 获取模板 id 登录https://mp.weixin.qq.com获取模板&#xff0c;如果没有合适的模板&#xff0c;可以申请添加新模板&#xff0c;审核通过后可使用&#xff0c;详见模板审核说明 页面的 <form/> 组件&#xff0c;属性report-submit为true时&#xff0c;可…