Java单元测试工具JUnit 5新特性一览

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50662639 Java单元测试工具JUnit 5新特性一览作者:chszs,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50662639

Java单元测试工具JUnit 5新特性一览

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

JUnit是最流行的开源Java单元测试工具,目前它的稳定版是4.12版。JUnit 4是2005年推出的,它基于Java 5的注释、反射等特性开发,距今已经超过十年了,受目前Java 8以及Lambda表达式等的影响,JUnit团队决定推出JUnit 5版。

目前JUnit 5已经推出了5.0.0 Alpha版,见: https://t.co/Mb12F3WF4A

一、JUnit 5的更新情况

JUnit 5完全使用当前的Java 8重写了所有代码,因此JUnit 5的运行条件是Java 8环境。
JUnit 5允许在断言中使用Lambda表达式,这个特性可以从开源的断言库AssertJ中可以看到。
AssertJ库见: http://joel-costigliola.github.io/assertj/
与JUnit 4不同,JUnit 5不再是单个库,而是模块化结构的集合,整个API分成了:自己的模块、引擎、launcher、针对Gradle和Surefire的集成模块。
JUnit团队还发起了名为Open Test Alliance for the JVM的活动,见: https://github.com/ota4j-team/opentest4j

JUnit 5的测试看上去与JUnit 4相同:同样是创建类,添加测试方法,使用@Test注释。但是,JUnit 5还提供了全新的一套注释集合,而且断言方法从JUnit 4的org.junit.Assert包移到了JUnit 5的org.junit.gen5.api.Assertions包。比如:

import org.junit.gen5.api.Assertions;
import org.junit.gen5.api.Test;
public class Test1 {
  @Test
  public void test()  {
    Assertions.assertEquals(3 * 6, 18);
    Assertions.assertTrue(5 > 4);
  }
}

二、JUnit 5断言

JUnit 5的断言方法与JUnit 4相似,断言类提供了assertTrue、assertEquals、assertNull、assertSame以及相反的断言方法。不同之处在于JUnit 5的断言方法支持Lambda表达式。而且还有一个名为分组断言(Grouped Assertions)的新特性。
分组断言允许执行一组断言,且会一起报告。要记得在JUnit 4中,我们被告诫不要在一个测试中放入多个断言,以避免某些断言没有得到执行。现在,在JUnit 5中使用分组断言就无需再顾虑这个避讳了。
对JUnit 4的另一个改进是断言预期的异常。不再是以前那种把预期的异常类型放入@Test注释,或者是用try-catch包裹代码,JUnit 5使用assertThrows和equalsThrows断言。下面看看断言的例子:

public class Test2 {
  @Test
  public void lambdaExpressions() {
    // lambda expression for condition
    assertTrue(() -> "".isEmpty(), "string should be empty");
    // lambda expression for assertion message
    assertEquals("foo", "foo", () -> "message is lazily evaluated");
  }
  @Test
  public void groupedAssertions() {
    Dimension dim = new Dimension(800, 600);
    assertAll("dimension", 
        () -> assertTrue(dim.getWidth() == 800, "width"),
        () -> assertTrue(dim.getHeight() == 600, "height"));
  }
  @Test
  public void exceptions() {
    // assert exception type
    assertThrows(RuntimeException.class, () -> {
      throw new NullPointerException();
    });
    // assert on the expected exception
    Throwable exception = expectThrows(RuntimeException.class, () -> {
      throw new NullPointerException("should not be null");
    });
    assertEquals("should not be null", exception.getMessage());
  }
}

三、假设、标签和禁止测试

假设、标签和禁止测试是JUnit 4的特性,在JUnit 5中仍然得以保留。不同的是假设中也支持Lambda表达式,假设的思想是如果假设条件没有得到满足,那么跳过测试执行。标签Tags等同于JUnit 4的测试分类的概念,可以对测试类和方法进行分类。JUnit 4禁止测试使用了@Ignore注释,而在JUnit 5中则使用@Disabled注释。

public class Test3 {
  @Test
  @Disabled
  public void disabledTest() {    
    // ...  
  }
  @Test
  @Tag("jenkins")
  public void jenkinsOnly() {
    // ...
  }

  @Test
  public void windowsOnly() {
    Assumptions.assumeTrue(System.getenv("OS").startsWith("Windows"));
    // ...
  }
}

四、扩展模型

JUnit 5提供了一套新的扩展API,取代了以前的@RunWith和@Rule扩展机制。JUnit 4的测试类被限制到仅有一个Runner上,而新的扩展模型则允许一个类或方法keyii注册到多种扩展。

@ExtendWith(MockitoExtension.class)
@ExtendWith(CdiUnitExtension.class)
public class Test4 {
  @Test
  @DisplayName("awesome test")
  void dependencyInjection(TestInfo testInfo) {
    assertEquals("awesome test", testInfo.getDisplayName());
  }
}

JUnit 5内建的扩展还支持方法级的依赖注入。

支持Hamcrest匹配和AssertJ断言库

JUnit 5支持Hamcrest匹配和AssertJ断言库,可以用它们来代替JUnit 5的方法。

public class Test5 {
  @Test
  public void emptyString() {
    // JUnit 5
    org.junit.gen5.api.Assertions.assertTrue("".isEmpty());

    // AssertJ
    org.assertj.core.api.Assertions.assertThat("").isEmpty();

    // Hamcrest
    org.hamcrest.MatcherAssert.assertThat("", isEmptyString());
  }
}

JUnit 5的主页见: https://github.com/junit-team/junit5
有兴趣的朋友可以关注。

目录
相关文章
|
8月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1135 3
|
9月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
317 0
|
11月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
477 1
|
11月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
977 1
|
11月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
530 0
|
11月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
465 1
|
11月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
655 0
|
测试技术 开发者 UED
探索软件测试的深度:从单元测试到自动化测试
【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
346 5