使用 MockMvc 和 @WebMvcTest 进行 SpringMVC程序的单元测试

MockMvc 是 Spring MVC 提供的一个用于测试 MVC 层的工具(Mock是模仿的意思,就是模仿Mvc调用)。它允许你发送 HTTP 请求到控制器,并验证响应是否符合预期。下面是一个使用 MockMvc 的例子:

首先,假设你有一个简单的 Spring MVC 控制器 HelloController

import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class HelloController {  
  
    @GetMapping("/hello")  
    public String hello() {  
        return "Hello, World!";  
    }  
}

现在,你想要编写一个单元测试来验证这个控制器是否按预期工作。你可以使用 MockMvc 来实现这一点:

import org.junit.jupiter.api.BeforeEach;  
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.test.web.servlet.MockMvc;  
import org.springframework.test.web.servlet.MvcResult;  
  
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;  
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;  
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;  
  
@WebMvcTest(HelloController.class)  
public class HelloControllerTest {  
  
    @Autowired  
    private MockMvc mockMvc;  
  
    @Test  
    public void testHello() throws Exception {  
        MvcResult mvcResult = mockMvc.perform(get("/hello"))  
                .andExpect(status().isOk())  
                .andExpect(content().string("Hello, World!"))  
                .andReturn();  
  
        // 你还可以从MvcResult中获取更多信息,比如响应的头部、内容类型等  
        int status = mvcResult.getResponse().getStatus();  
        String content = mvcResult.getResponse().getContentAsString();  
  
        // 这里可以添加更多的断言来验证响应的内容、状态码等  
        // 例如:  
        // assertEquals(200, status);  
        // assertEquals("Hello, World!", content);  
    }  
}

在这个例子中,@WebMvcTest(HelloController.class) 注解告诉 Spring Boot 仅加载与 HelloController 相关的组件,创建一个 MockMvc 实例,并自动装配到 HelloControllerTest 测试类中。

在 testHello 方法中,我们使用 mockMvc.perform(get("/hello")) 来模拟发送一个 GET 请求到 /hello 端点。然后,我们使用 andExpect 方法来添加一系列期望条件,验证响应的状态码是否为 200 OK,以及响应的内容是否为 "Hello, World!"

andReturn() 方法用于获取 MvcResult 对象,它包含了响应的详细信息,比如状态码、内容等。虽然在这个例子中我们没有使用 MvcResult 进行进一步的断言,但在实际测试中,你可以根据需要从中提取更多信息来验证响应。

通过使用 MockMvc,你可以很方便地测试 Spring MVC 控制器的各种场景,包括请求参数、路径变量、异常处理等。这有助于确保你的控制器按预期工作,并提高代码的质量。

MockMvc提供了丰富的方法来模拟HTTP请求和验证响应结果。以下是一些常用的MockMvc方法:

  1. perform() 方法
    • 这是MockMvc的核心方法,用于发送HTTP请求。它接受一个请求构建器(如MockMvcRequestBuilders.get()MockMvcRequestBuilders.post()等)作为参数,并返回一个ResultActions对象,该对象可用于进一步对响应进行验证和处理。
  2. andExpect() 方法
    • 这个方法用于添加期望条件,验证响应的结果。它接受一个ResultMatcher对象,用于对响应的各种属性(如状态码、内容、头部等)进行断言。例如,status().isOk()用于验证响应的状态码是否为200。
  3. andDo() 方法
    • 用于添加结果处理器,比如打印日志、记录测试结果等。它接受一个ResultHandler对象,可以在请求完成后执行一些自定义的操作。
  4. andReturn() 方法
    • 用于获取请求执行后的MvcResult对象,这个对象包含了响应的详细信息,如状态码、响应体、头部等。你可以使用MvcResult进行更深入的验证或自定义处理。
  5. 请求构建器(如MockMvcRequestBuilders类的方法)
    • MockMvc提供了多种静态方法来创建请求对象,如get()post()put()delete()等。这些方法允许你指定请求的URL、请求参数、请求头部等信息。

在使用MockMvc时,通常会先使用请求构建器创建一个请求对象,然后使用perform()方法发送请求,并通过链式调用的方式使用andExpect()添加期望条件,最后可能使用andReturn()获取响应结果进行进一步处理或验证。这样,你就可以方便地测试你的Spring MVC控制器,确保它们按照预期工作。

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因上精进,果上随缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值