You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为给定的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:15:40