如何为给定的Logo删除接口类编写JUnit单元测试用例
Logo删除接口JUnit测试落地方案
采用Spring Boot Test+Mockito+MockMvc实现web层隔离测试,不需要启动完整服务、不依赖真实数据库,执行效率高,可直接覆盖要求的两个核心场景。
测试类基础配置
测试类仅加载Controller层上下文,通过Mock实现Repository层的行为模拟,基础结构如下:
import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.mockito.ArgumentCaptor; // 替换为你项目中实际的Logo控制器类名 @WebMvcTest(LogoController.class) public class LogoControllerTest { @Autowired private MockMvc mockMvc; // 模拟Repository层Bean,替换为你项目中实际的Repository类型 @MockBean private LogoRepository logoRepository; // 后续测试方法写在这个类里 }
注意:测试类中配置的LogoController、LogoRepository需要替换为你项目中实际的类名,否则会出现Spring上下文加载失败的问题
场景1:删除成功返回200状态码
测试逻辑
传入合法ID,模拟Repository删除操作正常执行无异常,断言接口返回200状态码,同时校验Repository层确实被调用、传入的对象ID和请求ID一致。
测试代码
@Test void deleteLogo_ShouldReturn200_WhenDeleteSuccess() throws Exception { Long targetId = 1L; // 模拟删除操作正常执行 doNothing().when(logoRepository).delete(any(Logo.class)); // 发起DELETE请求并断言响应状态 mockMvc.perform(delete("/{id}", targetId) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); // 校验调用逻辑正确性:delete方法被调用1次,传入的Logo对象ID匹配 ArgumentCaptor<Logo> logoCaptor = ArgumentCaptor.forClass(Logo.class); verify(logoRepository, times(1)).delete(logoCaptor.capture()); assertEquals(targetId, logoCaptor.getValue().getId()); }
场景2:删除抛出异常返回409冲突状态
测试逻辑
模拟Repository删除操作抛出任意异常(比如外键约束冲突、数据不存在异常等),断言接口捕获异常后返回409状态码。
测试代码
@Test void deleteLogo_ShouldReturn409_WhenDeleteThrowException() throws Exception { Long targetId = 999L; // 模拟删除操作抛出运行时异常 doThrow(new RuntimeException("数据存在关联引用,无法删除")) .when(logoRepository).delete(any(Logo.class)); // 发起DELETE请求并断言响应状态 mockMvc.perform(delete("/{id}", targetId) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isConflict()); // 校验delete方法确实被调用 verify(logoRepository, times(1)).delete(any(Logo.class)); }
补充说明
- 如果需要覆盖特定异常场景(比如数据库约束异常
DataIntegrityViolationException、查询不到数据异常EmptyResultDataAccessException),只需要把第二个测试方法中doThrow传入的异常对象替换为对应类型即可,断言逻辑不需要调整 - 不需要对日志打印逻辑做断言,日志属于观测辅助能力,不属于核心业务校验范围
- 该测试方案为单元测试范畴,执行单条用例耗时在毫秒级,可直接集成到CI流水线中
内容的提问来源于stack exchange,提问作者Keerthi Devara
相关产品推荐
相关产品推荐

