1007 字
5 分钟
JUnit

JUnit是一个Java语言的单元测试框架。它广泛用于测试小型到大型代码库,以确保代码的正确性和稳定性。以下是JUnit的详细用法:

JUnit 基本用法#

添加依赖#

首先,你需要在项目的pom.xml文件中添加JUnit的依赖:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>unit-jupiter</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

编写测试类#

  • 使用@Test注解标记测试方法。
  • 使用assertEqualsassertTrueassertFalse等断言方法验证结果。
import org.junit.Test;
import static org.junit.Assert.*;
public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}
  • 命名规则:
    • 类名:XXXXTest
    • 方法名:testXXXX

运行测试#

  • 使用IDE的测试运行器。
  • 使用构建工具(如Maven或Gradle)运行测试。

JUnit 高级特性#

注解#

注解说明备注
@Test测试类中的方法用它修饰才能成为测试方法,才能启动执行单元测试
@BeforeEach用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。初始化资源(准备工作)
@AfterEach用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。释放资源(清理工作)
@BeforeAll用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。初始化资源(准备工作)
@AfterAll用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。释放资源(清理工作)
@ParameterizedTest参数化测试的注解 (可以让单个测试运行多次,每次运行时仅参数不同)用了该注解,就不需要@Test注解了
@ValueSource参数化测试的参数来源,赋予测试方法参数与参数化测试注解配合使用
@DisplayName指定测试类、测试方法显示的名称 (默认为类名、方法名)
public class CalculatorTest {
    @Before
    public void setUp() {
        // 初始化代码
    }
    @Test
    public void testAdd() {
        // 测试代码
    }
    @After
    public void tearDown() {
        // 清理代码
    }
}

断言#

Assertions下的静态方法:

  • assertEquals(expected, actual): 检查两个值是否相等。
  • assertTrue(condition): 检查条件是否为真。
  • assertFalse(condition): 检查条件是否为假。
  • assertNull(object): 检查对象是否为null。
  • assertNotNull(object): 检查对象是否不为null。
  • assertSame(expected, actual): 检查两个对象是否引用相同。
  • assertNotSame(expected, actual): 检查两个对象是否引用不同。

每个方法最后都可以传入一个String类型的message用于错误的提示

JUnit 的新特性#

JUnit 5架构#

JUnit 5由三个主要模块组成:

  • JUnit Platform: 为在JVM上启动测试提供基础设施。
  • JUnit Jupiter: JUnit 5的新测试引擎,提供注解、断言等。
  • JUnit Vintage: 允许在JUnit 5中运行JUnit 3和JUnit 4的测试。

注解改进#

  • @BeforeEach: 替代了JUnit 4的@Before
  • @AfterEach: 替代了JUnit 4的@After
  • @BeforeAll: 替代了JUnit 4的@BeforeClass
  • @AfterAll: 替代了JUnit 4的@AfterClass
  • @DisplayName: 为测试类或方法提供显示名称。
  • @Nested: 允许编写嵌套的测试类。

断言改进#

  • assertAll(): 组合多个断言,即使某个断言失败,也能执行所有断言。
  • assertThrows(): 检查代码是否抛出特定的异常。
public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        assertAll(
            () -> assertEquals(2, calculator.add(1, 1)),
            () -> assertEquals(4, calculator.add(2, 2))
        );
    }
    @Test
    public void testDivide() {
        Calculator calculator = new Calculator();
        assertThrows(ArithmeticException.class, () -> calculator.divide(1, 0));
    }
}

参数化测试改进#

JUnit 5提供了更简洁的参数化测试方式。

public class ParameterizedTest {
    @ParameterizedTest
    @CsvSource({
        "1, 1, 2",
        "2, 2, 4",
        "3, 3, 6"
    })
    public void testAdd(int numberA, int numberB, int expected) {
        Calculator calculator = new Calculator();
        assertEquals(expected, calculator.add(numberA, numberB));
    }
}

示例#

package com.auroralilis;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class demoTest {

    @Test
    public void testDemo(){
        int a = 1;
    }
    @Test
    public void testAsert(){
        int a = 1;
        assertEquals(a,1, "这是一个提示信息");
    }
    @Test
    public void testException(){
        Assertions.assertThrows(ArithmeticException.class, () -> {
            int i = 1, b = 0;
            int i1 = i / b;
        });
    }
    @ParameterizedTest
    @CsvSource({
            "1, 1, 2",
            "2, 2, 4",
            "3, 3, 6"
    })
    public void testAdd(int numberA, int numberB, int expected) {
        assertEquals(expected, (numberA + numberB));
    }
    @DisplayName("输出输入数字")
    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3})
    public void testSub(int numberA) {
        System.out.println(numberA);
    }
}
JUnit
http://zaoweiceng.github.io/posts/java_web/junit/
作者
静惜
发布于
2025-03-15
许可协议
CC BY-NC-SA 4.0