JUnit单元测试:保障代码质量
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);
}
}
最佳实践
- 测试命名规范:方法名_行为_期望结果
- 每个测试独立:不依赖其他测试的执行顺序
- 使用@BeforeEach:初始化测试环境
- 使用Mockito:模拟外部依赖
- 测试边界条件:空值、异常情况
总结
单元测试是保障代码质量的重要手段,JUnit提供了丰富的功能来编写和运行测试。掌握JUnit的使用,可以编写出可靠的测试用例,提高代码的质量和可维护性。