[JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用相关的知识,希望对你有一定的参考价值。

[JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用

JUnit5 由不同的模块组成,而这些模块分属于三个子项目:

  • Junit Platform

    提供了核心功能,如:

    • 测试引擎
    • 在 JVM 上挂载测试框架
    • 作为与构建工具(Maven/Gradle) 和 IDE (Eclipse, Intellij) 沟通的接口
    • 介绍了作为外部工具的 Launcher
  • Junit Jupiter

    对新的注解进行支持,如 @AfterEach, @AfterAll 等。

  • Junit Vintage

    添加向上支持,如对 Junit4 和 Junit3 的支持。

所以,JUnit5 = Junit Platform + Junit Jupiter + Junit Vintage

其具体组成如下:

创建 Junit5 项目

这里是用的是 Intellij,官网上对于如何构建 Juni5 的项目,描述的已经非常清楚了,具体的步骤在这里:JUnit 5

使用 Junit5 需要有 Java8 以上的支持。

使用 @Test 注解

一个 Java 的 Junit5 测试文件样式大题如下:

import org.junit.jupiter.api.Test;

class JunitTest {
  @Test
  void testMethod() {
    SomeObject obj = new SomeObject();
    assertTrue(obj.someMethoc());
  }

}

其中,@Test 注解是最重要的一环,它存在以下几个特性::

  • 标记方法为测试方法
  • 存在于 org.junit.jupiter.api 包中
  • 可见性可设置为 public, default 和 protected

使用断言(assertion)

上面的例子中使用了 assertTrue(),这代表调用 someMethoc() 方法预期返回 true。除了 assertTrue() 之外,Assertion 包含的测试方法有:

  • assertNull()

    实际为 null

  • assertNotNull()

    实际值不为 null

  • fail()

    测试挂了

    用于还没有实现的函数,否则当 Junit 运行时,会将未实现的方法当做无异常方法对待,这样就会通过测试

  • assertSame()

    预期值与实际值代表相同的对象

  • assertNotSame()

    预期值与实际值不代表相同的对象

  • assertTrue()

    实际值为 true

  • assertFalse()

    实际值为 false

  • assertEquals()

    预期值与实际值相同

    对于对象而言,这里会调用Object内置的 equals 方法,所以如果是对比Object的情况下,可能需要些helper函数,或者是用其他的方法进行对比。

  • assertNotEquals()

    预期值与实际值不相同

  • assertArrayEquals()

    预期值与实际数组相同

  • assertIterableEquals()

    预期值与实际的可迭代 相等——这意味着顺序也许要相等。

    刚刚就踩了一个坑:

  • assertThrows()

    断言可执行刨出对应的异常类型

    可以使用 Lambda 表达式实现:

    import static org.junit.jupiter.api.Assertions.assertThrows;
    
      import java.io.IOException;
    
      import org.junit.jupiter.api.Test;
    
      public class SampleTest {
    
          @Test
          public void testAssertThrows() {
              assertThrows(ArithmeticException.class, () -> divide(1, 0));
          }
      }
    
  • assertAll()

    将不同的断言分组

  • assertTimeout()

    断言可执行将会在指定时间内完成

    可以使用 java.time.Duration 中的 Duration.ofMinutes() 方法进行时间的控制。方法同样使用 Lambda 表达式:

      import static org.junit.jupiter.api.Assertions.assertTimeout;
    
      import java.io.IOException;
    
      import org.junit.jupiter.api.Test;
    
      public class SampleTest {
    
          @Test
          void testTimeout() {
              assertTimeout(Duration.ofMinutes(3), () -> {
              });
          }
      }
    
  • assertTimeoutPreemptively()

    断言如果超时,该执行将会优先被终止。

    assertTimeoutPreemptively()assertTimeout() 的区别在于,一旦超时,在assertTimeoutPreemptively() 中被调用的方法会被立刻终止,并返回失败;但是 assertTimeout() 中调用的函数会执行完毕,再返回失败。

以上是关于[JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用的主要内容,如果未能解决你的问题,请参考以下文章

Spring5---新特性(日志,函数式,Junit5)

[JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用

[JUnit] JUnit5 基础 4 - Maven 集成,参数化测试,重复测试 [完]

[JUnit] JUnit5 基础 3 - 依赖注入,假设(assume),开启/禁用测试 与 嵌套测试

[JUnit] JUnit5 基础 2 - 生命周期注解 和 DisplayName 注解

Chess案例学习,Class Diagram + 基础代码 + JUnit5