如何使用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
相关产品推荐
相关产品推荐

