365平台app下载

Java中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 和 32. 核心注解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())

);

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 因其更灵活的特性,推荐作为首选版本。

相关推荐