[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 结构 与 断言的使用的主要内容,如果未能解决你的问题,请参考以下文章
[JUnit] JUnit5 基础 1 - Junit5 结构 与 断言的使用
[JUnit] JUnit5 基础 4 - Maven 集成,参数化测试,重复测试 [完]
[JUnit] JUnit5 基础 3 - 依赖注入,假设(assume),开启/禁用测试 与 嵌套测试