Spring Boot中使用MockMvc测试PATCH请求控制器

在Spring Boot项目中,对控制器进行单元测试是确保代码质量和功能正确性的重要环节。本文将通过一个具体的例子,展示如何使用Spring的MockMvc框架来测试处理PATCH请求的控制器。

  1. 示例项目结构

    假设我们有一个简单的Spring Boot项目,其中包含一个ArticleController,用于处理与文章相关的PATCH请求。以下是控制器的代码:

    java复制

    @Controller

    @RequestMapping("/articles")

    public class ArticleController {

    @Autowired

    private ArticleService articleService;

    // 处理JSON和XML格式的PATCH请求

    @PatchMapping("/{id}")

    @ResponseBody

    public String patchArticle(@RequestBody Article article) {

    System.out.println("Article updating in controller: " + article);

    articleService.updateArticle(article.getId(), article.getContent());

    return "Article updated with content: " + article.getContent();

    }

    // 处理x-www-form-urlencoded格式的PATCH请求

    @PatchMapping(value = "/{id}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)

    @ResponseBody

    public String patchArticle(@RequestBody MultiValueMap<String, String> formParams) {

    System.out.println(formParams);

    long id = Long.parseLong(formParams.getFirst("id"));

    String content = formParams.getFirst("content");

    articleService.updateArticle(id, content);

    return "Article updated with content: " + content;

    }

    }

  2. 测试环境配置

    为了进行单元测试,我们需要配置测试环境。以下是相关的配置代码:

    java复制

    @EnableWebMvc

    @Configuration

    @ComponentScan

    public class MyWebConfig implements WebMvcConfigurer {

    }

  3. 单元测试代码

    我们将分别测试处理XML、JSON和x-www-form-urlencoded格式的PATCH请求。以下是测试代码:

    3.1 测试XML格式的PATCH请求

    java复制

    @RunWith(SpringJUnit4ClassRunner.class)

    @WebAppConfiguration

    @ContextConfiguration(classes = MyWebConfig.class)

    public class ControllerPatchTests {

    @Autowired

    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before

    public void setUp() {

    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

    }

    @Test

    public void testXmlController() throws Exception {

    long id = 1;

    String content = "new updated content";

    MockHttpServletRequestBuilder builder =

    MockMvcRequestBuilders.patch("/articles/" + id)

    .contentType(MediaType.APPLICATION_XML_VALUE)

    .accept(MediaType.APPLICATION_XML)

    .characterEncoding("UTF-8")

    .content(getArticleInXml(id, content));

    this.mockMvc.perform(builder)

    .andExpect(MockMvcResultMatchers.status().isOk())

    .andExpect(MockMvcResultMatchers.content().string("Article updated with content: " + content))

    .andDo(MockMvcResultHandlers.print());

    }

    private String getArticleInXml(long id, String content) {

    return "
    " + id + "" + content + " ";
    }
    }
    3.2 测试JSON格式的PATCH请求
    java复制
    @Test
    public void testJsonController() throws Exception {
    long id = 1;
    String content = "new updated content";
    MockHttpServletRequestBuilder builder =
    MockMvcRequestBuilders.patch("/articles/" + id)
    .contentType(MediaType.APPLICATION_JSON_VALUE)
    .accept(MediaType.APPLICATION_JSON)
    .characterEncoding("UTF-8")
    .content(getArticleInJson(id, content));
    this.mockMvc.perform(builder)
    .andExpect(MockMvcResultMatchers.status().isOk())
    .andExpect(MockMvcResultMatchers.content().string("Article updated with content: " + content))
    .andDo(MockMvcResultHandlers.print());
    }

private String getArticleInJson(long id, String content) {

return "{"id":"" + id + "", "content":"" + content + ""}";

}

3.3 测试x-www-form-urlencoded格式的PATCH请求

java复制

@Test

public void testFormParamController() throws Exception {

String id = "1";

String content = "new updated content";

MockHttpServletRequestBuilder builder =

MockMvcRequestBuilders.patch("/articles/" + id)

.contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)

.accept(MediaType.APPLICATION_FORM_URLENCODED)

.characterEncoding("UTF-8")

.content("id=" + id + "&content=" + content);

this.mockMvc.perform(builder)

.andExpect(MockMvcResultMatchers.status().isOk())

.andExpect(MockMvcResultMatchers.content().string("Article updated with content: " + content))

.andDo(MockMvcResultHandlers.print());

}

  1. 测试结果

运行上述测试代码后,MockMvc会模拟发送PATCH请求,并验证响应状态码和内容是否符合预期。以下是测试结果的示例输出:

测试XML请求的输出

复制

Article updating in controller: Article{id=1, content='new updated content'}

MockHttpServletRequest:

HTTP Method = PATCH

Request URI = /articles/1

Parameters = {}

Headers = {Content-Type=[application/xml;charset=UTF-8], Accept=[application/xml]}

Body =
1new updated content
Session Attrs = {}
Handler:
Type = com.logicbig.example.ArticleController
Method = public java.lang.String com.logicbig.example.ArticleController.patchArticle

相关推荐
勇哥java实战分享1 天前
短信平台 Pro 版本 ,比开源版本更强大
后端
学历真的很重要1 天前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪1 天前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端
韩师傅1 天前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端
栈与堆1 天前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥1 天前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似1 天前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡1 天前
Java CompletableFuture 接口与原理详解
后端
神奇小汤圆1 天前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端