下面我来用比较口语化的方式和你聊聊JUnit 5的用法,从导包、简单Demo,到注意事项和一些小技巧,咱们一步步说清楚~
1. 导入依赖(导包)
首先,如果你是用Maven构建项目,就需要在pom.xml
里加上JUnit 5的依赖。基本上只需要添加下面这段配置就行(记得scope设为test哦):
xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
这样Maven就会自动下载JUnit 5相关的jar包。除了这个,如果你需要参数化测试,还可以加上junit-jupiter-params
依赖~
citeturn0search2
2. 编写Demo
咱们写个简单的单元测试来验证一个方法。假设你有个类叫HelloWorld
,它有个方法sayHello()
返回一个字符串。你可以这么写测试类:
java
import org.junit.jupiter.api.*;
class HelloWorldTest {
@BeforeAll
static void initAll() {
System.out.println("所有测试开始前的初始化...");
}
@BeforeEach
void init() {
System.out.println("每个测试前的准备工作...");
}
@DisplayName("测试 sayHello 方法")
@Test
void testSayHello() {
HelloWorld hw = new HelloWorld();
String result = hw.sayHello();
// 使用断言来检查返回结果是否符合预期
Assertions.assertEquals("Hello, world!", result);
}
@AfterEach
void tearDown() {
System.out.println("每个测试结束后的清理工作...");
}
@AfterAll
static void tearDownAll() {
System.out.println("所有测试结束后的清理工作...");
}
}
这里几个注解的意思简单说一下:
- @BeforeAll 和 @AfterAll:分别在所有测试开始前和结束后只运行一次(记得它们必须是静态方法)。
- @BeforeEach 和 @AfterEach:每个测试方法执行前后各执行一次。
- @DisplayName:可以给测试类或方法自定义一个更友好的名字,这样在测试报告里看起来更清晰。
- @Test :标记一个方法为测试方法。
citeturn0search0
在JUnit 5里,有个好处就是测试方法和类不用非得写成public,这和之前JUnit 4有点区别,写成包级私有也OK。
3. 注意事项
在使用JUnit 5时,有几点小细节需要注意:
- 测试方法必须是无参且返回void。如果有参数了(除非你用参数化测试),JUnit 5会报错。
- @BeforeAll 和 @AfterAll方法一定要是static,否则运行时会出错。
- 测试方法不需要public修饰符 ,包级可见就够了。这点可以减少一些不必要的暴露~
citeturn0search5 - 如果你不想某个测试执行,可以加上**@Disabled**注解,这样JUnit在跑测试时就会跳过它。
- 尽量写有意义的断言 。使用
Assertions
提供的断言方法(比如assertEquals
、assertTrue
等),而不要仅仅依赖打印信息来判断测试结果。
4. 使用技巧
除了基本用法之外,还有一些小技巧可以帮助你写出更好、更高效的测试代码:
-
参数化测试 :用
@ParameterizedTest
配合@ValueSource
、@CsvSource
等可以让同一个测试方法跑多个数据组合。例如:java@ParameterizedTest @ValueSource(ints = {2, 4, 6}) void testEvenNumbers(int num) { Assertions.assertEquals(0, num % 2); }
这样就不用写多个类似的方法啦。
citeturn0search8
-
重复测试 :如果需要重复执行某个测试方法,可以用
@RepeatedTest
。例如:java@RepeatedTest(3) void repeatedTest() { System.out.println("这个测试会执行三次"); }
-
分组断言 :使用
assertAll
可以把多个断言放在一块执行,这样即使有个别断言失败,也能把所有失败信息都显示出来,方便调试。例如:java@Test void groupAssertions() { int[] nums = {0, 1, 2, 3}; Assertions.assertAll("检查数组各项", () -> Assertions.assertEquals(0, nums[0]), () -> Assertions.assertEquals(1, nums[1]), () -> Assertions.assertEquals(2, nums[2]) ); }
-
动态测试 :JUnit 5还支持动态生成测试案例,通过
@TestFactory
返回一组DynamicTest
,这对于测试一些运行时数据生成的场景非常有用。 -
使用Lambda表达式 :在断言消息里使用Lambda表达式可以延迟构造消息,有助于性能优化,尤其是当构造断言信息比较耗时时。
citeturn0search4
小结
简单来说,JUnit 5让单元测试变得更灵活、更现代化。咱们只需要:
- 在项目中导入JUnit 5依赖(比如用Maven配置)。
- 编写测试类,利用注解(@Test、@BeforeAll、@DisplayName等)来组织测试代码。
- 注意测试方法的格式(无参、void、非public也OK)。
- 掌握参数化测试、重复测试、分组断言等技巧,让测试代码更高效、更易读。
这样你就能写出既稳健又便于维护的单元测试啦!希望这些讲解对你有帮助~
参考资料:
citeturn0search0
citeturn0search8
citeturn0search9