如何使用JUnit和Mockito为void类型的delete方法编写单元测试
CarService delete 方法单元测试实现
我们基于 JUnit 5 + Mockito 编写单元测试,覆盖两个核心测试场景:
前置依赖
确认项目中已引入JUnit 5和Mockito相关依赖,Spring Boot项目可直接引入spring-boot-starter-test 启动器,已内置上述测试组件。
单元测试代码
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) public class CarServiceTest { // 模拟CarRepository依赖,不操作真实数据库 @Mock private CarRepository carRepository; // 注入模拟依赖到待测试的CarService实例 @InjectMocks private CarService carService; private static final Long TEST_CAR_ID = 1L; // 测试场景1:ID对应的Car存在 @Test void delete_WhenCarExists_ShouldSetActionStatusToDeleteAndSave() { // 构造测试数据 Car mockCar = new Car(); when(carRepository.findById(TEST_CAR_ID)).thenReturn(Optional.of(mockCar)); // 执行待测试方法 carService.delete(TEST_CAR_ID); // 结果验证 assertEquals("DELETE", mockCar.getActionStatus()); verify(carRepository, times(1)).save(mockCar); } // 测试场景2:ID对应的Car不存在 @Test void delete_WhenCarNotExists_ShouldThrowCustomException() { // 构造测试场景 when(carRepository.findById(TEST_CAR_ID)).thenReturn(Optional.empty()); // 执行并验证抛出指定异常 CustomException exception = assertThrows(CustomException.class, () -> carService.delete(TEST_CAR_ID)); assertEquals("custom message", exception.getMessage()); // 验证save方法未被调用 verify(carRepository, never()).save(any()); } }
说明
- 两个测试用例完整覆盖
delete方法的所有分支逻辑,代码覆盖度100% - 全程使用Mock对象模拟Repository交互,无真实数据库操作,测试执行速度快、无副作用
- 所有验证逻辑完全匹配业务定义的规则
内容的提问来源于stack exchange,提问作者shubham
相关产品推荐
相关产品推荐

