springboot之mockMVC测试Controller

本文详细介绍如何在SpringBoot环境下使用MockMvc进行Controller层的单元测试,包括测试环境搭建、依赖导入及具体测试代码示例,助您快速掌握MockMvc的使用技巧。

MockMvc简介

MockMvc实现对Http请求的模拟,可以方便对Controller进行测试,使得测试速度快、不依赖网络环境,而且提供验证的工具,使得请求的验证统一而且很方便

测试环境

jdk 1.8
springboot 2.x
junit4

导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
</dependency>

测试代码


import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;



//SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.class
@RunWith(SpringRunner.class)
//SpringBoot1.4版本之前用的是@SpringApplicationConfiguration(classes = Application.class)
@SpringBootTest
//测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的
@WebAppConfiguration
//@AutoConfigureMockMvc是用于自动配置MockMvc
@AutoConfigureMockMvc
class UserControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    @Autowired
    private MockMvc mockMvc;


    @Before()
    public void setup(){
        mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();//建议使用这种
    }

    @Test
    public void addUser() throws Exception{

        MvcResult response = mockMvc.perform(MockMvcRequestBuilders.post("/user/adduser")
                .contentType(MediaType.APPLICATION_JSON).param("userAccount","killer").param("userPassword",
                        "123456").param("userTel","133xxxx6657").param("userImage","logo").param("userName","jack").param(
                        "userNickname","jeff").param("userAcademy","失乐院").param("userClass","石乐志3班").param(
                        "userStudentNumber","2019212217890").param("userEmail","shilezhi@example.com").param("gender","男")
                .param("classId","2")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
        System.out.println("result:"+response.getResponse().getContentAsString());
    }
}

对mockMvc中一些方法的使用描述。
perform() 发送请求,获取请求结果里面的参数可以选择post|get|put|delete
post()里面的“/user/adduser"即为controller接口的对应url。
contentType()中选择数据的传输方式,这里采用的是JSON格式。
prama()中传输的就是键值对,前面为controller接收参数的名称,后面是传输的值。
andExpect()期望浏览器返回的状态码。这里期望返回200。
andDo(print())将返回信息打印出来。
getRespnse().getcontentAsString()请求返回的值。
返回值图
返回这样即为成功。

必坑指南

网上的一些注解被弃用,测试的注解就按博主的来最好,实体解析为JSON存在问题。(本人是手打的好多prama,后期如果尝试其他好用的会回来更新滴)

### 解决 Spring Boot 中 NoSuchBeanDefinitionException 'webHandler' 问题及使用 MockMvc 进行 Controller 单元测试Spring Boot 应用中,`NoSuchBeanDefinitionException: No bean named 'webHandler' available` 的异常通常表明应用上下文中缺少 `webHandler` Bean。以下是对此问题的详细分析与解决方案,以及如何配置 MockMvcController 进行单元测试。 #### 分析与解决 NoSuchBeanDefinitionException 'webHandler' 1. **确保正确启用 Web 支持** 如果项目是基于 Spring WebFlux 的响应式应用,则需要引入 `spring-boot-starter-webflux` 依赖[^4]。如果项目是基于 Spring MVC 的传统应用,则应引入 `spring-boot-starter-web` 依赖。缺少正确的 Starter 会导致相关 Bean(如 `webHandler`)未被注册到应用上下文。 ```xml <!-- Spring MVC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring WebFlux --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` 2. **检查注解配置** 确保主类或配置类上添加了 `@SpringBootApplication` 或 `@EnableWebMvc` 注解。这些注解会自动扫描并注册必要的 Bean 到应用上下文中[^1]。 ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 3. **验证组件扫描路径** 如果自定义了组件扫描路径,确保 `webHandler` 所属的包被正确包含在内。可以通过 `@ComponentScan` 明确指定扫描路径[^2]。 ```java @SpringBootApplication @ComponentScan(basePackages = {"com.example.controller", "com.example.handler"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 4. **启用调试模式** 如果仍然无法定位问题,可以启用调试模式以获取更多上下文加载信息。通过在 `application.properties` 中设置日志级别为 `DEBUG`,可以帮助排查 Bean 初始化过程中的问题[^3]。 ```properties logging.level.org.springframework=DEBUG ``` --- #### 配置 MockMvc 进行 Controller 单元测试 MockMvcSpring 提供的一个工具,用于对 Controller 层进行单元测试。以下是其配置与使用的示例: 1. **引入测试依赖** 确保项目中包含 `spring-boot-starter-test` 依赖,它包含了 MockMvc 的支持。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` 2. **编写测试类** 使用 `@WebMvcTest` 注解来切片测试 Controller,并通过 `@Autowired` 注入 MockMvc 实例。 ```java @WebMvcTest(MyController.class) public class MyControllerTest { @Autowired private MockMvc mockMvc; @MockBean private MyService myService; @Test public void testGetResource() throws Exception { // 模拟服务层返回值 when(myService.getData()).thenReturn("Mocked Data"); // 发起 GET 请求并验证响应 mockMvc.perform(get("/api/resource")) .andExpect(status().isOk()) .andExpect(content().string("Mocked Data")); } } ``` 3. **处理复杂场景** 如果需要测试复杂的请求参数或路径变量,可以使用 `MockMvcRequestBuilders` 构建更详细的请求。 ```java mockMvc.perform(post("/api/resource") .contentType(MediaType.APPLICATION_JSON) .content("{\"key\":\"value\"}")) .andExpect(status().isCreated()); ``` --- #### 注意事项 - **Mock 依赖** 使用 `@MockBean` 注解模拟 Controller 的依赖 Bean,避免加载不必要的组件,从而提高测试速度和隔离性。 - **测试环境隔离** 确保测试环境中只加载必要的 Bean 和配置,避免因全量加载导致的性能问题或冲突。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值