Java单元测试框架 - JUnit

article/2025/9/11 0:51:45

导航

  • 我们为什么需要单元测试框架?
  • 为工程添加JUnit支持
  • 编写JUnit单元测试案例
    • JUnit常用注解
    • JUnit常用断言
    • JUnit案例
    • Spring整合

我们为什么需要单元测试框架?

  当我们需要对一段代码进行测试时,怎么样让他快速跑起来呢?一个很自然的想法是编写一个main()方法,然后运行一些测试代码,我想各位大多都用过这种方法。

  但是使用main()方法测试有很多缺点:一个类只能有一个main()方法,难以同时编写多个测试案例;没有详细的测试结果,如期望值、实际值等,若想实现,则需要自行开发的代码量过多;如果需要用到Spring容器等,则简单的main()方法实现起来也不再简单。

  因此,我们需要一种测试框架,帮助我们编写单元测试案例。

为工程添加JUnit支持

  JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛。JUnit是事实上的单元测试的标准框架,任何Java开发者都应当学习并使用JUnit编写单元测试。

  使用JUnit编写单元测试的好处在于,我们可以非常简单地组织测试代码,并随时运行它们,JUnit就会给出成功的测试和失败的测试,还可以生成测试报告,不仅包含测试的成功率,还可以统计测试的代码覆盖率,即被测试的代码本身有多少经过了测试。对于高质量的代码来说,测试覆盖率应该在60%以上,但也不用过分追求覆盖率,需要考虑边际效益的影响。

  几乎所有的IDE工具都集成了JUnit,这样我们就可以直接在IDE中编写并运行JUnit测试。

  以IDEA为例,首先我们需要增加JUnit的依赖,如果为maven工程,则直接在pom文件里加上如下依赖即可,如果是普通工程,则需要自行下载jar包并导入。

		<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>

  然后打开需要被测试的类,右键 -> Generate,然后选择JUnit版本
在这里插入图片描述

  或者右键 -> Go To -> Test,若这个类还未创建测试类,则会提示创建。
在这里插入图片描述

在这里插入图片描述

  IDEA会自动在test包下,生成对应目录与测试文件。

  需要注意的是test目录需被设置为Tests source root,若未自动设置,需在右上角File->Project Structure->Modules下,进行设置。
在这里插入图片描述

编写JUnit单元测试案例

JUnit常用注解

  JUnit中的常用注解如下:

注解作用
@BeforeClass表示在类刚开始时执行,只会执行一次
@AfterClass表示在类结束时执行,只会执行一次
@Before表示在每个被@Test注解的方法之前执行
@After表示在每个被@Test注解的方法之后执行
@Test用于标注测试方法,一个类里可以有多个

  当一个测试类跑起来时,执行顺序为:

@BeforeClass -> @Before -> @Test -> @After -> @AfterClass

JUnit常用断言

  JUnit中的常用断言如下:

断言方法解释
assertEquals(expected,actual)对比两个对象是否相等
assertNotEquals(unexpected, actual)对比两个对象是否不相等
assertSame(expected, actual)对比两个对象是否为同一个对象
assertNotSame(unexpected, actual)对比两个对象是否为不同对象
assertNull(object)查看对象是否为空
assertNotNull(object)查看对象是否不为空
assertTrue(condition)判断表达式是否为true
assertFalse(condition)判断表达式是否为false
assertFalse(condition)判断表达式是否为false
assertArrayEquals(expecteds, actuals)对比两个数组是否相等
fail()直接断言为失败

JUnit案例

  来一个demo~新建一个Factorial类,提供一个计算阶乘的静态方法:

public class Factorial {public static long calculationFactorial(long n) {if (n < 0) {throw new IllegalArgumentException();}long r = 1;for (long i = 1; i <= n; i++) {r = r * i;}return r;}
}

  编写这个类的测试类:


public class FactorialTest {@BeforeClasspublic static void beforeClass(){System.out.println("我先“执行”为敬! -- -- by @BeforeClass");}@AfterClasspublic static void afterClass(){System.out.println("测试案例都跑完了,该我执行了 -- by @AfterClass");}@Beforepublic void before(){System.out.println("我在每个案例前先执行 -- by @Before");}@Afterpublic void after(){System.out.println("我在每个案例后执行 -- by @After");}@Testpublic void given_5_when_calculation_then_get_120() {System.out.println("案例:输入5 期望120,执行中");long result = Factorial.calculationFactorial(5);assertEquals(120,result);}@Testpublic void given_1_when_calculation_then_get_1() {System.out.println("案例:输入1 期望1,执行中");long result = Factorial.calculationFactorial(1);assertEquals(1,result);}@Testpublic void given_0_when_calculation_then_get_1() {System.out.println("案例:输入0 期望1,执行中");long result = Factorial.calculationFactorial(0);assertEquals(1,result);}@Testpublic void given_negative_when_calculation_then_exception() {System.out.println("案例:输入负数 期望IllegalArgumentException异常,执行中");try{Factorial.calculationFactorial(-1);fail();}catch (Exception e){assertEquals(IllegalArgumentException.class,e.getClass());}}
}

  执行后,可以在Run标签下查看测试结果报告:
在这里插入图片描述

  我Demo里写的Before、Atfer等无具体意义,仅演示用法。在实际工作中,经常会使用这写方法做测试数据的准备与清理。

Spring整合

  如果是对Spring容器做测试,需要从容器中取对象,则还需设法获取Spring容器。

  方案一:可以在每个测试案例里手动获取:

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountService",IAccountService.class);

  方案二:使用@Runwith注解。需先导入Spring-test包

<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.2.RELEASE</version>
</dependency>

  再使用@ContextConfiguration指定配置文件。然后就可以在测试类里使用@Autowired从容器里获取对象了:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class FactorialTest {@@Autowiredprivate Factorial factorial;
}

  方案三:如果使用的是SpringBoot框架,那么直接使用@SpringBootTest注解即可:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseTest {
}

http://chatgpt.dhexx.cn/article/5XZN29NG.shtml

相关文章

java单元测试之mock篇

java单元测试之mock篇 一、什么是mock&#xff1f;二、为什么要进行mock&#xff1f;三、IDEA中使用Mock3.1、引入mock所需依赖3.1、IDEA单元测试必备快捷键3.2、Mock测试相关注解Mock注解InjectMocks注解调用PowerMockito.spy()方法Mock使用方式或者技巧静态方法mockStaticPre…

Java单元测试之Mock框架

一、引言二、为什么要用Mock三、Mock使用场景四、Mock定义五、Mock框架五、Mockito5.1 Mockito基本使用5.2 MockMVC测试5.2.1 初始化MockMvc对象5.2.2 接口测试5.2.3 常用API 一、引言 实际工作中&#xff0c;可能会遇到如下情况&#xff1a; 场景一&#xff1a;依赖接口不通…

Java单元测试实践-01.单元测试概述与示例

Java单元测试实践-00.目录&#xff08;9万多字文档700多测试示例&#xff09; https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 以下内容为本人以开发人员的视角&#xff0c;在平时进行单元测试过程中的总结。主要内容为通用的&#xff0c;不限制具体业务…

如何写Java单元测试

本文引自https://www.cnblogs.com/ysw-go/p/5447056.html 什么是单元测试   我们在编写大型程序的时候&#xff0c;需要写成千上万个方法或函数&#xff0c;这些函数的功能可能很强大&#xff0c;但我们在程序中只用到该函数的一小部分功能&#xff0c;并且经过调试可以确定…

Java单元测试总结

[版权申明] 非商业目的注明出处可自由转载 博文地址&#xff1a; 出自&#xff1a;shusheng007 文章目录 概述单元测试概念测试项目单元测试工具JUnitMockito SpringBoot测试总结 概述 关于为什么要做单元测试是老生常谈了&#xff0c;越是小公司越不重视单元测试&#xff0c;…

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;…