← 返回首页

JUnit单元测试:保障代码质量

📂 java ⏱ 2 min 209 words

JUnit单元测试:保障代码质量

概述

JUnit是Java最流行的单元测试框架,它提供了丰富的注解和断言方法,帮助开发者编写和运行测试用例。

1. JUnit 5基础

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

class CalculatorTest {
    private Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    }

    @AfterEach
    void tearDown() {
        calculator = null;
    }

    @Test
    void testAdd() {
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    void testSubtract() {
        assertEquals(1, calculator.subtract(3, 2));
    }

    @Test
    void testDivide() {
        assertThrows(ArithmeticException.class, () -> {
            calculator.divide(1, 0);
        });
    }
}

2. 参数化测试

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;

class ParameterizedTestDemo {

    @ParameterizedTest
    @ValueSource(strings = {"Java", "Python", "C++"})
    void testStringLength(String language) {
        assertTrue(language.length() > 0);
    }

    @ParameterizedTest
    @CsvSource({"1, 2, 3", "10, 20, 30", "100, 200, 300"})
    void testAdd(int a, int b, int expected) {
        assertEquals(expected, a + b);
    }
}

3. 嵌套测试

@DisplayName("用户管理测试")
class UserTest {

    @Nested
    @DisplayName("创建用户")
    class CreateUser {
        @Test
        @DisplayName("创建有效用户")
        void createValidUser() {
            User user = new User("admin", "admin@example.com");
            assertNotNull(user);
            assertEquals("admin", user.getUsername());
        }
    }

    @Nested
    @DisplayName("验证用户")
    class ValidateUser {
        @Test
        @DisplayName("用户名不能为空")
        void usernameCannotBeNull() {
            assertThrows(IllegalArgumentException.class, () -> {
                new User(null, "test@example.com");
            });
        }
    }
}

4. Mockito集成

import org.mockito.*;
import static org.mockito.Mockito.*;

class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    void testFindUser() {
        when(userRepository.findById(1L))
            .thenReturn(Optional.of(new User(1L, "admin")));

        User user = userService.findById(1L);

        assertNotNull(user);
        assertEquals("admin", user.getUsername());
        verify(userRepository, times(1)).findById(1L);
    }
}

最佳实践

  1. 测试命名规范:方法名_行为_期望结果
  2. 每个测试独立:不依赖其他测试的执行顺序
  3. 使用@BeforeEach:初始化测试环境
  4. 使用Mockito:模拟外部依赖
  5. 测试边界条件:空值、异常情况

总结

单元测试是保障代码质量的重要手段,JUnit提供了丰富的功能来编写和运行测试。掌握JUnit的使用,可以编写出可靠的测试用例,提高代码的质量和可维护性。