0


使用 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控制器,确保它们按照预期工作。

标签: 单元测试 spring

本文转载自: https://blog.csdn.net/anguang1973/article/details/137882958
版权归原作者 因上精进,果上随缘 所有, 如有侵权,请联系我们删除。

“使用 MockMvc 和 @WebMvcTest 进行 SpringMVC程序的单元测试”的评论:

还没有评论