下面我来用比较口语化的方式和你聊聊JUnit 5的用法,从导包、简单Demo,到注意事项和一些小技巧,咱们一步步说清楚~
1. 导入依赖(导包)
首先,如果你是用Maven构建项目,就需要在pom.xml里加上JUnit 5的依赖。基本上只需要添加下面这段配置就行(记得scope设为test哦):
这样Maven就会自动下载JUnit 5相关的jar包。除了这个,如果你需要参数化测试,还可以加上junit-jupiter-params依赖~
citeturn0search2
2. 编写Demo
咱们写个简单的单元测试来验证一个方法。假设你有个类叫HelloWorld,它有个方法sayHello()返回一个字符串。你可以这么写测试类:
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等可以让同一个测试方法跑多个数据组合。例如:
@ParameterizedTest
@ValueSource(ints = {2, 4, 6})
void testEvenNumbers(int num) {
Assertions.assertEquals(0, num % 2);
}
这样就不用写多个类似的方法啦。
citeturn0search8
重复测试:如果需要重复执行某个测试方法,可以用@RepeatedTest。例如:
@RepeatedTest(3)
void repeatedTest() {
System.out.println("这个测试会执行三次");
}
分组断言:使用assertAll可以把多个断言放在一块执行,这样即使有个别断言失败,也能把所有失败信息都显示出来,方便调试。例如:
@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