Java中单元测试框架JUnit知识点整理
作者:hqxstudying
在Java开发中JUnit是最常用的单元测试框架之一,编写JUnit测试的目的是确保代码的正确性、可维护性和可扩展性,这篇文章主要介绍了Java中单元测试框架JUnit知识点整理的相关资料,需要的朋友可以参考下
JUnit 是 Java 中最常用的单元测试框架,用于编写和运行可重复的测试。以下是 JUnit 的核心知识点整理:
1. JUnit 版本差异
- JUnit 4:基于注解(如
@Test
、@Before
),兼容 Java 5+ - JUnit 5(Jupiter):是 JUnit 的新一代版本,包含三个子项目:
- JUnit Platform:测试运行平台
- JUnit Jupiter:新的编程模型和扩展模型
- JUnit Vintage:兼容 JUnit 4 和 3
2. 核心注解
JUnit 4 常用注解
@Test
:标记测试方法@Before
:每个测试方法执行前运行@After
:每个测试方法执行后运行@BeforeClass
:所有测试方法执行前运行(静态方法)@AfterClass
:所有测试方法执行后运行(静态方法)@Ignore
:忽略该测试方法
JUnit 5 新增注解
@Test
:功能增强,无需声明异常@BeforeEach
:替代 JUnit 4 的@Before
@AfterEach
:替代 JUnit 4 的@After
@BeforeAll
:替代 JUnit 4 的@BeforeClass
@AfterAll
:替代 JUnit 4 的@AfterClass
@Disabled
:替代@Ignore
@DisplayName
:为测试类或方法设置可读性名称@Nested
:标记嵌套测试类@Tag
:为测试打标签,用于筛选执行@ParameterizedTest
:参数化测试(需配合参数源注解)
3. 断言(Assertions)
用于验证测试结果是否符合预期。
JUnit 4
- 主要使用
org.junit.Assert
类的静态方法:assertEquals(expected, actual); // 相等判断 assertTrue(condition); // 验证为真 assertFalse(condition); // 验证为假 assertNull(object); // 验证为 null assertNotNull(object); // 验证不为 null assertSame(expected, actual); // 验证引用相同
JUnit 5
- 断言位于
org.junit.jupiter.api.Assertions
:- 功能类似,但支持 lambda 表达式延迟计算:
assertEquals(expected, actual, () -> "自定义错误消息");
- 新增
assertAll()
支持批量断言(所有断言都会执行):assertAll("用户信息", () -> assertEquals("Alice", user.getName()), () -> assertEquals(30, user.getAge()) );
- 功能类似,但支持 lambda 表达式延迟计算:
4. 测试执行顺序
- JUnit 4:默认按方法名哈希排序,可通过
@FixMethodOrder
控制 - JUnit 5:默认无序,可通过
@TestMethodOrder
配合MethodOrderer
控制(如按名称、按注解顺序等)
5. 参数化测试
允许使用不同参数多次运行同一测试方法。
JUnit 5 实现
需配合参数源注解(如 @ValueSource
、@CsvSource
等):
@ParameterizedTest @ValueSource(strings = {"apple", "banana", "cherry"}) void testStringLength(String fruit) { assertTrue(fruit.length() > 3); } @ParameterizedTest @CsvSource({"1, 2, 3", "4, 5, 9", "2, 3, 5"}) void testAdd(int a, int b, int expected) { assertEquals(expected, a + b); }
6. 异常测试
验证方法是否抛出预期异常。
JUnit 4
@Test(expected = ArithmeticException.class) public void testDivideByZero() { int result = 1 / 0; }
JUnit 5
@Test void testDivideByZero() { assertThrows(ArithmeticException.class, () -> { int result = 1 / 0; }); }
7. 超时测试
限制测试方法的执行时间。
JUnit 4
@Test(timeout = 1000) // 毫秒 public void testLongRunningMethod() { // 执行耗时操作 }
JUnit 5
@Test void testLongRunningMethod() { assertTimeout(Duration.ofSeconds(1), () -> { // 执行耗时操作 }); }
8. 嵌套测试(JUnit 5)
通过 @Nested
注解创建嵌套测试类,增强测试结构的可读性:
class UserServiceTest { @Nested class WhenUserIsNew { @Test void shouldCreateUserSuccessfully() { // 测试逻辑 } } @Nested class WhenUserExists { @Test void shouldThrowDuplicateException() { // 测试逻辑 } } }
9. 测试套件(Test Suite)
将多个测试类组合成一个套件执行。
JUnit 4
@RunWith(Suite.class) @Suite.SuiteClasses({UserTest.class, OrderTest.class}) public class AllTests {}
JUnit 5
@Suite @SelectClasses({UserTest.class, OrderTest.class}) public class AllTests {}
10. 扩展机制(JUnit 5)
通过 Extension
接口实现自定义扩展,如:
- 测试前后的自定义逻辑
- 参数注入
- 异常处理等
11. 集成工具
- 构建工具:Maven(通过
pom.xml
)、Gradle 中配置 JUnit 依赖 - IDE:IntelliJ IDEA、Eclipse 内置支持 JUnit 测试运行
- CI/CD:可与 Jenkins、GitHub Actions 等集成,自动执行测试
掌握这些知识点可以帮助你编写规范、高效的单元测试,提升代码质量和可维护性。实际使用中,JUnit 5 因其更灵活的特性,推荐作为首选版本。
总结
到此这篇关于Java中单元测试框架JUnit知识点整理的文章就介绍到这了,更多相关Java JUnit知识点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!