SpringBoot之单元测试JUnit5

SpringBoot整合Junit4和Junit5 1.使用相同的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> 2.Junit4测试 import org.junit.After; import org.junit.Before; import org.junit.Tes 阅读详情
  1. Junit5介绍

SpringBoot2开始引入Junit5为单元测试的默认库。Junit5与之前版本的Junit框架变化很大。其由三个不同子项目的不同模块组成。

  • Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。
  • Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行。
  • Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容Junit3和Junit4的测试引擎。

Tips: SpringBoot2.4以上版本移除默认对Vintage的依赖,如果需要兼容Junit4需要自行引入依赖。 For Maven:

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

For Gradle:

testImplementation("org.junit.vintage:junit-vintage-engine") {
    exclude group: "org.hamcrest", module: "hamcrest-core"
}

  1. Junit5的变化
  • 注解在 org.junit.jupiter.api 包中,断言在 org.junit.jupiter.api.Assertions 类中,前置条件在 org.junit.jupiter.api.Assumptions 类中。
  • @Before 和@After 替换成@BeforeEach 和@AfterEach。
  • @BeforeClass 和@AfterClass 替换成@BeforeAll 和@AfterAll。
  • @Ignore 替换成@Disabled。
  • @Category 替换成@Tag。
  • @RunWith、@Rule 和@ClassRule 替换成@ExtendWith。
  1. Junit5常用注释
  • @Test: 表示方法是测试方法
  • @DisplayName : 为测试类或者测试方法设置展示名称
  • @BeforeEach : 表示在每个单元测试之前执行
  • @BeforeEach : 表示在每个单元测试之前执行
  • @AfterEach : 表示在每个单元测试之后执行
  • @BeforeAll : 表示在所有单元测试之前执行
  • @AfterAll : 表示在所有单元测试之后执行
  • @Disabled : 表示测试类或测试方法不执行
  • @Tag : 表示单元测试类别
  • @Timeout : 表示测试方法运行如果超过了指定时间将会返回错误
@DisplayName( " 标准测试类 " )
public class StandardTests {
    @BeforeAll
    static void initAll() {
        System.out.println( " 所有单元测试之前执行 " );
    }

    @BeforeEach
    void init() {
        System.out.println( " 每个单元测试之前执行 " );
    }

    @Test
    @Tag( " 成功 " )
    void succeedingTest() {
        System.out.println( "a succeding test" );
    }

    @Test
    @Tag( " 失败 " )
    void failingTest() {
        System.out.println( "a failing test" );
    }

    @Test
    @Tag( " 超时 " )
    @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
    void failsIfExecutionTimeExceeds100Milliseconds() throws InterruptedException {
        Thread.sleep(500);
    }

    @Test
    @Tag( " 跳过 " )
    @Disabled( "for demonstration purposes" )
    void skippedTest() {
         // not executed
 }

    @AfterEach
    void tearDown() {
        System.out.println( " 每个单元测试之后执行 " );
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println( " 所有单元测试之后执行 " );
    }
}

  1. 参数化测试 参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。

利用 @ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。

@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型

@NullSource: 表示为参数化测试提供一个null的入参

@EnumSource: 表示为参数化测试提供一个枚举入参

@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参

@MethodSource:表示读取指定方法的返回值作为参数化测试入参

public class ParameterizedTestDemo {
    @ParameterizedTest
    @ValueSource(strings = { "one" ,  "two" ,  "three" })
    @DisplayName( " 值来源参数 " )
    public void parameterizedTest1(String string) {
        System.out.println(string);
    }

    @ParameterizedTest
    @MethodSource( "fruit" )
    @DisplayName( " 方法来源参数 " )
    public void testWithExplicitLocalMethodSource(String name) {
        System.out.println(name);
    }

    static Stream<String> fruit() {
        return Stream.of( "apple" ,  "banana" );
    }
}

  1. 断言

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证,并增加了一些适合与Java 8 lambdas一起使用的断言方法。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。

public class AssertionsDemo {
    @Test
    @DisplayName( " 简单断言 " )
    @Description( " 用来对单个值进行简单的验证 " )
    public void simple() {
        assertEquals(2, 2,  "simple math" );
        assertNotEquals(3, 2);

        assertNotSame(new Object(), new Object());
        Object obj = new Object();
        assertSame(obj, obj);

        assertFalse(1 > 2);
        assertTrue(1 < 2);

        assertNull(null);
        assertNotNull(new Object());
    }

    @Test
    @DisplayName( " 数组断言 " )
    @Description( " 通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等 " )
    public void array() {
        assertArrayEquals(new int[]{1, 2}, new int[] {1, 2});
    }
     /**

     * assertAll 方法接受多个 org.junit.jupiter.api.Executable 函数式接口的实例作为要验证的断言 
     * 可以通过 lambda 表达式很容易的提供这些断言 
     */
    @Test
    @DisplayName( " 组合断言 " )
    public void all() {
        assertAll( "Math" ,
                () -> assertEquals(2, 1 + 1),
                () -> assertTrue(1 > 0)
        );
    }

     /**
     * 在 JUnit4 时期,想要测试方法的异常情况时,需要用 @Rule 注解的 ExpectedException 变量还是比较麻烦的。 
     * 而 JUnit5 提供了一种新的断言方式 Assertions.assertThrows() , 配合函数式编程就可以进行使用。 
     */
    @Test
    @DisplayName( " 异常断言 " )
    public void exceptionTest() {
        ArithmeticException exception = Assertions.assertThrows(
                 // 扔出断言异常 
                ArithmeticException.class, () -> System.out.println(1 % 0));
    }

    @Test
    @DisplayName( " 超时断言 " )
    public void timeoutTest() {
         // 如果测试方法时间超过 1s 将会异常 
         Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));
    }

    @Test
    @DisplayName( " 快速失败 " )
    @Description( "fail 方法直接使得测试失败 " )
    public void shouldFail() {
        fail( "This should fail" );
    }
}

  1. 前置条件

JUnit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。

@DisplayName( " 前置条件 " )
public class AssumptionsDemo {
    private final String environment =  "DEV" ;

    @Test
    @DisplayName( "simple" )
    public void simpleAssume() {
        assumeTrue(Objects.equals(this.environment,  "DEV" ));
        assumeFalse(() -> Objects.equals(this.environment,  "PROD" ));
    }

    @Test
    @DisplayName( "assume then do" )
    public void assumeThenDo() {
        assumingThat(
                Objects.equals(this.environment,  "DEV" ),
                () -> System.out.println( "In DEV" )
        );
    }
}

assumeTrue 和 assumFalse 确保给定的条件为 true 或 false,不满足条件会使得测试执行终止。assumingThat 的参数是表示条件的布尔值和对应的 Executable 接口的实现对象。只有条件满足时,Executable 对象才会被执行;当条件不满足时,测试执行并不会终止。

Spring Boot 单元测试(一)JUnit5 前言 Spring Boot 2.2.0 版本开始引入 JUnit5 作为单元测试默认库,在此之前版本spring-boot-starter-test使用 JUnit4,Spring Boot 2.2.0 版本之后替换成 JUnit Jupiter。 Spring Boot 工程创建成功后自动生成XxxApplicationTests单元测试类,此类的作用是检查应用程序上下文能否正常启动。@SpringBootTest注解作用是查找带@SpringBootApplication注解的配置类,使用该类启动 阅读详情

相关推荐

【SpringBoot深入浅出系列】SpringBoot之集成JUnit5进行单元测试

文章目录一、JUnit 5 是什么?JUnit PlatformJUnit JupiterJUnit Vintage二、为什么使用 JUnit 5 ?三、JUnit 4 和 JUnit 5 的区别1.导入2.@Test 注解3.超时写法发生变化4.其它注解5.断言6.假设7.扩展四、创建项目集成 JUnit5 进行单元测试1.项目说明2.创建 Spring Initializr 项目 junit(1).添加依赖(2).添加配置(3).新建实体类 User(4).新建控制类 LoginController3.

邓邓子的博客 4027

SpringBoot 单元测试——JUnit5

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> @SpringBootTest class Boot05WebAdminApplicationTes.

weixin_44302046的博客 1万+

基于simulink的变压器保护仿真设计【MATLAB源码+Word文档】

电力系统变压器保护MATLAB/simulink仿真设计。纵联差动保护-过电流保护-距离保护

weixin_761237174的博客 1271

SpringBoot2核心技术-核心功能-02-单元测试

单元测试 1、JUnit5 的变化 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成。 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以

qqzhengwei的专栏 935

SMPLify-X关键点映射与OpenPose格式转换实战

本文深入解析了SMPLify-X与OpenPose之间关键点映射与格式转换的实战方法。针对SMPL、SMPL-H、SMPLX等参数化人体模型与OpenPose 2D姿态估计标准之间的数据鸿沟,文章详细对比了双方的关键点定义差异,并提供了核心的Python转换代码与映射表构建思路。通过清晰的步骤讲解与调试技巧,帮助开发者实现3D关节数据到OpenPose标准格式的高效、准确转换,为动作捕捉、3D姿态估计等应用奠定数据基础。

weixin_29046035的博客 166

利用Docker Compose简化openGauss多节点容器化部署

本文详细介绍了如何利用Docker Compose简化openGauss多节点容器化部署,从环境准备到配置文件编写,再到集群部署与验证,提供了一套完整的解决方案。通过Docker Compose,原本复杂的手动部署流程被大幅简化,显著提升了部署效率和可靠性,特别适合企业级开源数据库的高可用架构需求。

weixin_30338481的博客 60

Spring Boot中使用JUnit5进行单元测试

Spring Boot学了这么久,我还没用过它。今天我就系统完整地学习总结一下在Spring Boot中使用JUnit5框架进行单元测试。其实本节主要还是学习JUnit5的使用。有一句话说的好,我可以不用,但我必须会用。 1.JUnit5 的变化 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库。作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成(JUnit 5 = JUnit Platform + J.

weixin_50216991的博客 2504

易智联LM401模块学习(一)——初识Lora

Lora

weixin_46046597的博客 1056

Spring Boot 基于 JUnit 5 实现单元测试

本文介绍 Spring Boot 2 基于 JUnit 5 的单元测试实现方案。 目录 忽略测试用例执行 RunWith 配置 @Before、@BeforeClass、@After、@AfterClass 被替换 简介 JUnit 4 和 JUnit 5 的差异 开发环境 示例 简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2....

风水道人 6380

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 213

计算机视觉安防监控升级:人脸识别与行为异常检测

计算机视觉安防监控升级:人脸识别与行为异常检测 ,人工智能,计算机视觉,大模型,AI,本文将深入探讨人脸识别与行为异常检测技术在安防监控中的应用,包括技术原理、算法实现、应用场景以及面临的挑战与解决方案。通过实际案例和代码示例,帮助读者更好地理解和掌握这些技术,为推动安防监控系统的智能化升级提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 23万+

【Springboot】单元测试Junit5应用

JUnit 5是一个功能强大的测试框架,常用于编写和执行这些单元测试。

十一仓 2586

【精细解读】xapp585(多通道LVDS接口ADC)

xapp585的参考设计有Verilog和VHDL两种源码。

FPGA艺术家的博客 533

spring boot Junit5单元测试

依赖 <!--单元测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> ...

风.foxwho(神秘狐) 6609

第42篇FEDGLOSS算法BEYOND LOCAL SHARPNESS:COMMUNICATION-EFFICIENT GLOBALSHARPNESS-AWARE MINIMIZATIONFOR

:用上一轮伪梯度最小化锐度,获取与全局损失最相关的几何信息,引导全局优化趋向更平坦的最小值。效果对比分析:FEDGLOss。

weixin_74009895的博客 526

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SpringBoot2中JUnit5单元测试总结

SpringBoot2中JUnit5单元测试总结 1、JUnit5整体概述 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。 JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部 包含了一个测试引擎,用于在Junit

IT晓可程序员之路 3781

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Springboot中JUNIT5单元测试+Mockito详解

单元测试:针对方法(最小功能单元)的测试,由程序员自己写。 JUnit是什么:一种帮助我们编写测试的标准测试框架。不使用单元测试时,我们测试一个方法能否成功运行,我们会在主方法里调用这个方法,看看控制台的运行结果。 或者更直接的把需要测试代码放到主方法里,看能不能运行成功。 局限性:但是使用这种方式测试代码局限性很大,比如只有一个main方法无法有组织有层次的测试不同的方法。比如测试的输出结果不够直观。所以我们需要专门的JUnit来编写单元测试IDE工具为IDEASpringBoot的包中,默认集成了JUn

baomingshu的博客 7889

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringBoot--->>>单元测试-->>JUnit5的变化

1、JUnit5 的变化 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成。 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。 JUnit

wowo 503

JUnit5单元测试(基于SpringBoot)

SpringBoot2之单元测试(JUnit5) 1.JUnit版本的变迁(了解) 相信很多小伙伴们都用过JUnit4,但是自从SpringBoot 2.2.0 版本的出现,JUnit5就作为了单元测试的默认库。 毛哥(博主)我使用的SpringBoot2.6.7,默认的JUnit版本仲裁 5.8.2: 所以今天咱们就来聊聊最新版本JUnit5: JUnit5与之前版本(JUnit3/4)做了很大的改变。它由三个不同子项目的几个模块组成: JUnit Platform:Junit Platform是

maogenb的博客 2674

SpringBoot使用JUnit5实现单元测试

单元测试(Unit Test)是为了检验程序的正确性。一个单元可能是单个程序、类、对象、方法等,它是应用程序的最小可测试部件。SpringBoot提供了 spring-boot-starter-test 启动器。通过它,能引入一些有用的测试库。在SpringBoot中进行单元测试很简单,它已经自动添加好了Test的Starter依赖。JUnit5是对程序代码进行单元测试的Java框架。它用来编写自动化测试工具,降低测试的难度、减少烦琐性、并有效避免出现程序错误。

pan_junbiao的博客 4881

springboot单元测试JUnit5、断言

springboot单元测试JUnit5、断言

qq_37705525的博客 1354

Spring Boot学习笔记(五)—— 使用JUnit5编写单元测试

1.开发环境 Mac OS 10.14 JDK8 Maven 3.5.3 Eclipse 4.9.0 Spring Boot 2.0.5.RELEASE JUnit 5.1.1 2.JUnit5简介[1] JUnit 5跟以前的JUnit版本不一样,它由几大不同的模块组成,这些模块分别来自三个不同的子项目。 JUnit 5 = JUnit Platform + JUnit Jupiter + ...

swift0824的博客 1万+

springboot单元测试-junit4和junit5

1.在想测试的方法里使用idea的代码自动生成功能,在该类下右键,点击generate,选择test,因为这里没有我们 想要的测试框架,所以我们随便选择一个测试框架,目的就是为了生成包和代码,然后找到生成的代码,在类上面添加 @RunWith(SpringRunner.class) @SpringBootTest 这两个注解。在测试方法上加@Test注解就可以了 @RunWith(SpringRu...

fall_hat的博客 1047

SpringBoot单元测试进阶:Mockito+JUnit5深度整合

在Spring Boot开发过程中,单元测试是保证代码质量和可维护性的重要手段。JUnit 5作为Java领域广泛使用的测试框架,提供了丰富的测试功能和注解。而Mockito则是一个强大的Mock框架,能够帮助我们模拟对象和行为,隔离外部依赖,使单元测试更加独立和高效。本文将深入探讨如何将Mockito和JUnit 5深度整合到Spring Boot项目中,提升单元测试的能力。

梵心白莲的博客 1182

Springboot JUnit5 Controller 单元测试

描述: 因为进行单元测试时发现@Before未执行,故留贴在此记录; 原因: JUnit5 需要使用 @BeforeEach 和@AfterEach; 上码 Controller package com.sendiyang.xiyeming.controller; import org.springframework.web.bind.annotation.RequestMappin...

xiyeming的博客 5013

有啥不同?来看看Spring Boot 基于 JUnit 5 实现单元测试

作者:又语www.jianshu.com/p/4648fd55830e本文介绍 Spring Boot 2 基于 JUnit 5 的单元测试实现方案。目录 简介JUnit 4 和 JUn...

Java知音 1653
上一篇: 互联网公司面试必考,带你掌握扎实的数据结构和算法知识
下一篇: Activiti工作流引擎中责任链模式的建立与应用原理
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值