基于JUnit4和JUnit5配合例子讲解JUnit的两种运行方式

1 引言

最近读的书有老有新,在读的过程中都完全完成了相应例子的构建和运行。在读《Spring in Action》1第4版时,其第37页的例子(以下称例子1)基于JUnit 4,并需要spring-test.jar;而在读《JUnit in Action》2第3版时,其第7页的例子(以下称例子2)基于JUnit 5,并采用自动化构建工具Maven运行。为此作为学习记录,本文将自己手工运行例子1和Maven运行例子2的过程记录下来,给出手工和Maven运行JUnit的两种方式,同时比较JUnit 4 和 JUnit 5的些许区别。

JUnit 是一个单元测试框架,由软件工程领域的大牛Erich Gamma和Kent Beck在1997年发布。JUnit能帮助我们构建自动化单元测试,是Java语言自动化测试的事实标准。它能简化编写自动化测试程序,尤其是当程序规模大且不断变动时,亦即当进行回归测试时,其作用会凸显。

JUnit 4大概在2010年左右广泛使用,书《JUnit in Action》的第2版是基于此版本的。JUnit 5大概在2020年左右逐渐广泛使用,《JUnit in Action》2第3版是基于此版本的。目前,在读一些稍微旧一点的书籍时,或者在参加一些项目的培训时,仍然会见到JUnit 4版本的使用。为此,本文例子1将基于JUnit 4讲解,而例子2将基于JUnit 5版本讲解。

例子1所依赖的环境为:

名称版本
JDK1.8.0_281
Spring4.1.1
JUnit4.11

例子2所依赖的环境为:

名称版本
JDK1.8.0_281
JUnit5.6.0
Maven3.8.8

2 例子

2.1 例子1

例子1本来在书中是利用Gradle工具构建的,我改成了手工运行,相应地文件夹结构也改成我自己的了。因为后续我还要运行该书中的很多例子,所以我把例子所依赖的jar都放到了一个固定的文件夹lib中,即D:\StudyCase\java\servletjsp\rbprj\springinaction\lib中。该例子是一个基于Spring的普通Java程序,并用xml配置文件形式写了测试程序,演示了Spring依赖注入的效果。

CompactDisc.java的内容如下:

package soundsystem;// javac -d classes src/soundsystem/CompactDisc.javapublic interface CompactDisc {void play();
}

SgtPeppers.java的内容如下:

package soundsystem;
import org.springframework.stereotype.Component;// javac -classpath D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-core-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-beans-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-context-4.1.1.RELEASE.jar;classes;. -d classes src/soundsystem/SgtPeppers.java@Component
public class SgtPeppers implements CompactDisc {private String title = "Sgt. Pepper's Lonely Hearts Club Band";  private String artist = "The Beatles";public void play() {System.out.println("Playing " + title + " by " + artist);}}

采用自动配置方式的xml文件soundsystem.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:c="http://www.springframework.org/schema/c"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="soundsystem" /></beans>

测试代码CDPlayerXMLConfigTest.java的内容如下:

package soundsystem;// javac -classpath D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\system-rules-1.18.0.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\junit-4.11.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-test-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-core-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-beans-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-context-4.1.1.RELEASE.jar;classes;. -d classes src/soundsystem/CDPlayerXMLConfigTest.java// java -classpath D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-aop-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\hamcrest-core-1.3.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\system-rules-1.18.0.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\junit-4.11.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-test-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-expression-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\commons-logging-1.1.3.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-core-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-beans-4.1.1.RELEASE.jar;D:\StudyCase\java\servletjsp\rbprj\springinaction\lib\spring-context-4.1.1.RELEASE.jar;classes;. org.junit.runner.JUnitCore soundsystem.CDPlayerXMLConfigTestimport static org.junit.Assert.*;import org.junit.Rule;
import org.junit.Test;
//import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
import org.junit.contrib.java.lang.system.SystemOutRule;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:soundsystem.xml")
public class CDPlayerXMLConfigTest {@Rulepublic final SystemOutRule log = new SystemOutRule().enableLog();//@Autowired//private MediaPlayer player;@Autowiredprivate CompactDisc cd;@Testpublic void cdShouldNotBeNull() {assertNotNull(cd);}//@Test/*public void play() {player.play();assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n", log.getLog());}*/}

从上面代码和前述中可以看出:

  1. Spring 4要与JUnit 4配合使用。
  2. 在JUnit 4 版本下,org.junit.contrib.java.lang.system.StandardOutputStreamLog已经不存在,需改用org.junit.contrib.java.lang.system.SystemOutRule,相应地在lib文件夹中需加上system-rules-1.18.0.jar,该jar的版本可微调。可见,虽然该书是2015年出版,JUnit 4也相对比较老了,但代码还是更老。
  3. 在JUnit 4 下,已经开始使用标注(Annotation)Test,且测试类不用继承JUnit 框架中的特定类。
  4. 由于是测试的基于Spring 4 的程序,需要包含spring-test-4.1.1.RELEASE.jar。

该例子经过编译后,即可运行,编译或运行指令已写在上面代码中。运行结果如下:
在这里插入图片描述
阅读上面的运行结果,可以看出运行成功,测试通过。虽然出现了3个 Could not instantiate TestExecutionListener,但是这3个TestExecutionListener与本程序无关。最关键的是

信息: Using TestExecutionListeners: [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@ba4d54, org.springframework.test.context.support.DirtiesContextTestExecutionListener@12bc6874]

表明使用的是依赖注入TestExecutionListener,本例子正是测试依赖注入的。

手工不能直接运行该测试类,需要将测试类作为org.junit.runner.JUnitCore的参数运行,该类作为命令行的参数需用包的形式书写,即soundsystem.CDPlayerXMLConfigTest

2.2 例子2

该例子是一个非常简单的基于JUnit 5的例子。因为使用Maven运行,其文件夹结构需符合Maven的要求,如下:

├── src/
│   ├── main/
│   │	├──java/
│   │	│   ├──/com/manning/junitbook/ch01/Calculator.java
│   └── test/
│   │	├──java/
│   │	│   ├──/com/manning/junitbook/ch01/CalculatorTest.java
├── pom.xml

Calculator.java的内容如下:

package com.manning.junitbook.ch01;public class Calculator {public double add(double number1, double number2) {return number1 + number2;}
}

CalculatorTest.java的内容如下:

package com.manning.junitbook.ch01;import static org.junit.jupiter.api.Assertions.assertEquals;import org.junit.jupiter.api.Test;public class CalculatorTest {@Testpublic void testAdd() {Calculator calculator = new Calculator();double result = calculator.add(10, 50);assertEquals(60, result, 0);}
}

pom.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.manning.junitbook</groupId><artifactId>ch01-jumpstart</artifactId><version>1.0-SNAPSHOT</version><name>ch01-jumpstart</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><build><plugins><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.6.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.6.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.6.0</version><scope>test</scope></dependency></dependencies>
</project>

在命令行中输入mvn clean install,会出现如下运行结果:
在这里插入图片描述
证明测试成功,并通过。同时会在根路径,即包含pom.xml的路径,产生target文件夹,其中内容包含可执行的class文件。使用Maven自动化构建工具是很方便的。

3 总结

本文基于不同的JUnit版本(4和5)分别介绍了JUnit的两种不同使用方式—手工和Maven,通过代码的方式可以看出JUnit 5的包结构发生了改变,能帮助初学者入门JUnit 框架的使用和代码阅读。若想对JUnit 更深入了解,推荐阅读文献2


  1. Craig Walls. Spring in Action. 4th Edition. Shelter Island, NY: Manning Publications, 2015, pp37-37. ↩︎

  2. CĂTĂLIN TUDOSE. JUnit in Action. 3rd Edition. Shelter Island, NY: Manning Publications, 2020, pp7-12. ↩︎ ↩︎ ↩︎

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

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

相关文章

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …

使用Python创建、读取和修改Word文档

自动化文档处理是提升工作效率的关键路径之一&#xff0c;而Python凭借其简洁语法和丰富的生态工具链&#xff0c;是实现文档自动化处理的理想工具。通过编程手段批量生成结构规范的合同模板、动态注入数据分析结果生成可视化报告&#xff0c;或是快速提取海量文档中的关键信息…

Android Studio 2024.2.2.13版本安装配置详细教程

Android Studio 是由 Google 官方开发和维护的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为 Android 应用开发设计。它是基于 JetBrains 的 IntelliJ IDEA 平台构建的&#xff0c;集成了丰富的工具和功能&#xff0c;帮助开发者高效构建、调试、测试和发布 Androi…

Qt实现简易音乐播放器

使用Qt6实现简易音乐播放器&#xff0c;效果如下&#xff1a; github&#xff1a; Gabriel-gxb/MusicPlayer: qt6实现简易音乐播放器 一、整体架构 基于Qt框架构建 整个音乐播放器程序以Qt框架为基础进行开发。Qt提供了丰富的类库和工具&#xff0c;方便开发者构建图形用户界…

GPT-4使用次数有上限吗?一文了解使用规则

GPT-4的推出&#xff0c;让越来越多的用户开始体验其卓越的功能。无论是用于日常需求还是专业内容制作&#xff0c;GPT-4的应用范围广泛&#xff0c;获得了用户的广泛赞誉。但是&#xff0c;在具体使用过程中&#xff0c;不少用户发现自己似乎触碰到了GPT-4的使用上限&#xff…

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果&#xff0c;通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感&#xff0c;比如水的波动、反射、折射、透明等&#xff0c;可以让人感觉像真实的水一样流动闪耀。 核心特点就是&#xff1a; 动态波纹光学特…

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串&#xff08;String&#xff09;redis列表&#xff08;List&#xff09;redis哈希表&#xff08;Hash&#xff09;redis集合&#xff08;Set&#xff09;redis有序集合&#xff08;ZSet / SortedSet&…

Linux之安装docker

一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本&#xff0c;它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客&#xff0c;Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本&#xff0c;版本号为 14.1.2.0.0 &#xff0c;目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外&#xff0c;还增加了对 Java SE 17&#xff08;J…

feign 远程调用详解

在平常的开发工作中&#xff0c;我们经常需要跟其他系统交互&#xff0c;比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么&#xff0c;我们应该通过什么方式进行系统之间的交互呢&#xff1f;今天&#xff0c;简单来总结下 feign 的用法。 1&#xff1a;引入依…

解决 npm : 无法加载文件 D:\nodeJS\node_global\npm.ps1,因为在此系统上禁止运行脚本。

问题 在我将nodeJS从18更新到22之后&#xff0c;我发现在黑窗口运行npm run dev&#xff0c;可以成功启动项目&#xff0c;但是在Cursor的终端中却报如下错误&#xff1a; PS D:\DESKTOP\项目\vue-ems-admain> npm run dev npm : 无法加载文件 D:\Users\Download\nodeJS\no…

快速对QWen2.5大模型进行微调

先看看训练结果&#xff1a; 目录 前言什么是LLaMA-Factory&#xff1f;安装LLaMA-Factory准备数据集配置微调参数运行微调脚本评估和保存模型使用微调后的模型可视化微调大模型总结 前言 在当今人工智能领域&#xff0c;大模型&#xff08;如LLaMA、GPT等&#xff09;的微调…

深入理解linux中的文件(下)

目录 一、语言级缓冲区和内核级缓冲区 二、C语音中的FILE* fp fopen(“./file.txt”,"w"): 四、理解磁盘结构&#xff1a; 物理结构 逻辑结构 五、未被打开的文件&#xff1a; 六、更加深入理解inode编号怎么找到文件&#xff1a; 七、对路径结构进行…

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service 的…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码&#xff0c;发现登不上去 过滤掉了or&#xff0c;&#xff0c;当尝试了n种方法以后&#xff0c;最关键的是发现()居然也被过滤了 哈哈&#xff0c;那玩个淡&#xff0c; 再搜wp&#xff01;&#xff01; 当输入admin的时候&#xff0c;提示密码错误&#xff0…

Zenoh在工业物联网场景中的性能研究

论文标题 中文标题&#xff1a;Zenoh在工业物联网场景中的性能研究 英文标题&#xff1a;On the performance of Zenoh in Industrial IoT Scenarios 作者信息 Miguel Barn, Luis Diez, Mihail Zverev, Jos R. Jurez, Ramn Agero Miguel Barn&#xff1a;Ikerlan技术研究中心…

一次奇怪的空指针问题分析:事务、死锁与隐式回滚

最近我们在排查一个诡异的 空指针异常&#xff0c;整个分析过程可以说是跌宕起伏&#xff0c;最终的结论也颇具隐蔽性。今天就把这个问题分享出来&#xff0c;希望对大家有所帮助。 问题现象 在系统中&#xff0c;我们有 单据 B&#xff0c;它通过一个 关联 ID 字段与 上级单…

掌握API和控制点(从Java到JNI接口)_37 JNI开发与NDK 05

*.so的入口函数&#xff1a;JNI_OnLoad() 执行System.loadLibrary()函数时&#xff0c; VM会反向调用*.so里的JNI_OnLoad()函数。用途有二&#xff1a; 1. VM询问此*.so使用的JNI版本编号。 2. VM要求*.so做一些初期设定工作(Initialization)&#xff0c;例如登记<函…

MySQL数据库 (三)- 函数/约束/多表查询/事务

目录 一 函数 (一 字符串函数 (二 数值函数 (三 日期函数 (四 流程函数 二 约束 (一 概述 (二 约束演示 (三 外键约束 三 多表查询 (一 多表关系 1 一对多&#xff08;多对一&#xff09; 2 多对多 3 一对一 (二 多表查询概述 (三 内连接 1 查询语法 2 代码实…

EGO-Planner文章解读(一)——论文原理和算法实现

在fastplanner中&#xff0c;ESDF 对于评估梯度大小和方向至关重要。然而轨迹优化过程只覆盖了 ESDF 更新范围的非常有限的子空间&#xff0c;计算全图的ESDF是非常冗余的。除此之外&#xff0c;在建图的时候只能看见障碍物的表面&#xff0c;看不见障碍物的后面/内部&#xff…