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

如何使用Mockito和JUnit测试Spring Boot中的DELETE请求方法

解决方案:Spring Boot控制器DELETE请求的JUnit+Mockito单元测试

没问题,我来帮你搞定这个DELETE请求的单元测试!咱们用JUnit 5(Spring Boot默认集成版本)和Mockito来实现,完全不需要依赖真实数据库,专注测试控制器的逻辑。

第一步:确认依赖

首先确保你的pom.xml(Gradle用户对应build.gradle)里已经包含Spring Boot测试依赖,它已经集成了JUnit 5、Mockito和MockMvc:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

第二步:编写控制器测试类

我们用@WebMvcTest专门测试控制器层,这个注解只会加载控制器相关的Bean,不会初始化整个Spring上下文,测试速度更快。然后用@MockBean模拟ApplicationService,避免调用真实的Service和DAO逻辑。

完整测试代码如下:

import com.fasterxml.jackson.databind.ObjectMapper;
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 static org.mockito.Mockito.verify;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@WebMvcTest(ApplicationController.class) // 替换成你的实际控制器类名
public class ApplicationControllerTest {

    @Autowired
    private MockMvc mockMvc; // 用来模拟HTTP请求

    @MockBean
    private ApplicationService applicationService; // 模拟Service层

    @Test
    void deleteApplicationByObject_ShouldReturnDeleted() throws Exception {
        // 1. 构造测试用的Application对象
        Long testId = 1L;
        Application testApplication = new Application();
        testApplication.setId(testId);

        // 2. 把对象转成JSON字符串(Spring Boot默认集成Jackson)
        ObjectMapper objectMapper = new ObjectMapper();
        String requestBody = objectMapper.writeValueAsString(testApplication);

        // 3. 发送DELETE请求并验证结果
        mockMvc.perform(delete("/applications")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(requestBody))
                .andExpect(status().isOk()) // 验证返回状态码为200
                .andExpect(content().string("Deleted")); // 验证返回体是"Deleted"

        // 4. 验证Service的deleteById方法被正确调用了一次,参数为testId
        verify(applicationService).deleteById(testId);
    }
}

关键部分解释

  • @WebMvcTest:只扫描指定的控制器类,加载最小化的Spring上下文,适合控制器层的单元测试。
  • @MockBean:创建ApplicationService的Mock实例,替代真实Service实现,让我们无需关心Service内部逻辑,只需验证控制器是否正确调用了Service方法。
  • MockMvc:模拟HTTP请求,发送DELETE请求并验证响应结果。
  • verify(applicationService).deleteById(testId):确保控制器确实调用了Service的deleteById方法,且传入了正确的id参数,这是验证控制器逻辑正确性的核心。

额外补充:Service层单元测试

如果之后需要测试Service的removeById方法,同样可以用Mockito模拟DAO层:

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 static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
public class ApplicationServiceTest {

    @Mock
    private ApplicationDao applicationDao; // 模拟DAO层

    @InjectMocks
    private ApplicationServiceImpl applicationService; // 把Mock的DAO注入到Service中

    @Test
    void removeById_ShouldCallDaoDeleteById() {
        Long testId = 1L;
        applicationService.removeById(testId);
        verify(applicationDao).deleteById(testId); // 验证DAO的deleteById方法被调用
    }
}

这样就能分别完成控制器层和服务层的单元测试,完全隔离各层级依赖,测试结果更可靠。

内容的提问来源于stack exchange,提问作者Ravi Mengar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:53