JUnit5的新特性

简介: JUnit5的新特性

前言:

JUnit5比4增加了很多新特性,最近刚使用了一下JUnit5记录一下看到和使用了的新特性,
先看下JUnit5的的包结构
JUnit5的包结构:

JUnit5和4开始支持的java版本也不一样,JUnit4需要Java 5或更高版本,JUnit 5需要Java 8或更高版本。

新特性:

1.断言

在Junit4中,org.junit.Assert具有所有断言方法来验证预期结果和结果。
例如:

public static void assertEquals(long expected, long actual)

JUnit5断言使用的是org.junit.jupiter.api.assertions不再是assert。
例如:

public static void assertEquals(short expected, short actual)

2.常用注解

JUnit4 JUnit5 说明
@Test @Test 表示该方法是一个测试方法。JUnit5与JUnit 4的@Test注解不同的是,它没有声明任何属性,因为JUnit Jupiter中的测试扩展是基于它们自己的专用注解来完成的。这样的方法会被继承,除非它们被覆盖
@BeforeClass @BeforeAll 表示使用了该注解的方法应该在当前类中所有使用了@Test @RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之前 执行;
@AfterClass @AfterAll 表示使用了该注解的方法应该在当前类中所有使用了@Test、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之后执行;
@Before @BeforeEach 表示使用了该注解的方法应该在当前类中每一个使用了@Test、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之前 执行
@After @AfterEach 表示使用了该注解的方法应该在当前类中每一个使用了@Test、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之后 执行
@Ignore @Disabled 用于禁用一个测试类或测试方法
@Category @Tag 用于声明过滤测试的tags,该注解可以用在方法或类上;类似于TesgNG的测试组或JUnit 4的分类。
@Parameters @ParameterizedTest 表示该方法是一个参数化测试
@RunWith @ExtendWith @Runwith就是放在测试类名之前,用来确定这个类怎么运行的
@Rule @ExtendWith Rule是一组实现了TestRule接口的共享类,提供了验证、监视TestCase和外部资源管理等能力
@ClassRule @ExtendWith @ClassRule用于测试类中的静态变量,必须是TestRule接口的实例,且访问修饰符必须为public。

3.嵌套测试:

在测试用例比较多的情况下,JUnit5支持将测试用例嵌套,如下面的例子:
用DisplayName来标识测试用例,分层来显示

@DisplayName("A stack")
class TestingAStackDemo {
    Stack<Object> stack;

    @Test
    @DisplayName("is instantiated with new Stack()")
    void isInstantiatedWithNew() {
        new Stack<>();
    }

    @Nested
    @DisplayName("when new")
    class WhenNew {
        @BeforeEach
        void createNewStack() {
            stack = new Stack<>();
        }

        @Test
        @DisplayName("is empty")
        void isEmpty() {
            assertTrue(stack.isEmpty());
        }

        @Test
        @DisplayName("throws EmptyStackException when popped")
        void throwsExceptionWhenPopped() {
            assertThrows(EmptyStackException.class, () -> stack.pop());
        }

        @Test
        @DisplayName("throws EmptyStackException when peeked")
        void throwsExceptionWhenPeeked() {
            assertThrows(EmptyStackException.class, () -> stack.peek());
        }

        @Nested
        @DisplayName("after pushing an element")
        class AfterPushing {
            String anElement = "an element";

            @BeforeEach
            void pushAnElement() {
                stack.push(anElement);
            }

            @Test
            @DisplayName("it is no longer empty")
            void isNotEmpty() {
                assertFalse(stack.isEmpty());
            }

            @Test
            @DisplayName("returns the element when popped and is empty")
            void returnElementWhenPopped() {
                assertEquals(anElement, stack.pop());
                assertTrue(stack.isEmpty());
            }

            @Test
            @DisplayName("returns the element when peeked but remains not empty")
            void returnElementWhenPeeked() {
                assertEquals(anElement, stack.peek());
                assertFalse(stack.isEmpty());
            }

        }
    }
}

4.顺序测试

在JUnit4中@FixMethodOrder注解来决定单测的执行顺序,但是这个很不方便,只能根据JVM或者名字排名来确定执行顺序。
在JUnit5中引入了@TestMethodOrder方法,配合@Order注解就可以按照自己指定的顺序来进行单元测试。
例如:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderTest {

    @Test
    @Order(2)
    @Disabled
    public void testTwo() {
        System.out.println("执行单测2");
        assertEquals(1, 1);
    }

    @Test
    @Order(1)
    public void testOne() {
        System.out.println("执行单测1");
        assertEquals(1, 1);
    }

    @Test
    @Order(3)
    public void testThree() {
        System.out.println("执行单测3");
        assertEquals(1, 1);
    }
}

如上文的的输出就会是:

执行单元测试1
执行单元测试2
执行单元测试3

Order中可以填写的数字是非负数,数字越大,越后执行。

相关文章
|
2月前
|
测试技术
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
27 2
|
12月前
|
Java 数据库 Spring
Spring Boot 学习研究笔记(四) -Junit 5 中注解特性
Spring Boot 学习研究笔记(四) -Junit 5 中注解特性
|
Java 测试技术 Maven
Junit5 架构、新特性及基本使用(常用注解与套件执行)
Junit5 架构、新特性及基本使用(常用注解与套件执行)
|
Java 测试技术 Maven
Junit5 架构、新特性及基本使用(常用注解与套件执行)
![](https://ceshiren.com/uploads/default/original/3X/1/9/19cd7a17afd569fed22deb329ae7010ae8ab3c7a.jpeg) 什么是 Junit5,在 Junit5 的官方介绍文档中这写到: Junit5 由JUnit Platform + JUnit Jupiter + JUnit Vintage3部分构成,借
|
Java 测试技术 Maven
Junit5 架构、新特性及基本使用(常用注解与套件执行)
![](https://ceshiren.com/uploads/default/original/3X/1/9/19cd7a17afd569fed22deb329ae7010ae8ab3c7a.jpeg) 什么是 Junit5,在 Junit5 的官方介绍文档中这写到: Junit5 由JUnit Platform + JUnit Jupiter + JUnit Vintage3部分构成,借
|
Java 测试技术 Maven
Junit5 架构、新特性及基本使用(常用注解与套件执行)
![](https://ceshiren.com/uploads/default/original/3X/1/9/19cd7a17afd569fed22deb329ae7010ae8ab3c7a.jpeg) 什么是 Junit5,在 Junit5 的官方介绍文档中这写到: Junit5 由JUnit Platform + JUnit Jupiter + JUnit Vintage3部分构成,借
|
Java 测试技术 API
Java单元测试工具JUnit 5新特性一览
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50662639 Java单元测试工具JUnit 5新特性一览 作者:chszs,未经博主允许不得转载。
1197 0
|
2月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
22天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
49 6
|
2月前
|
测试技术
如何使用 JUnit 测试方法是否存在异常
【8月更文挑战第22天】
19 0