- 创建 Junit5 项目
- 使用 @Test 注解
- 使用断言(assertion)
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
上面的例子中使用了 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 结构 与 断言的使用 [JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用](http://www.mshxw.com/aiimages/31/282100.png)
