在Spring Boot项目中,对控制器进行单元测试是确保代码质量和功能正确性的重要环节。本文将通过一个具体的例子,展示如何使用Spring的MockMvc框架来测试处理PATCH请求的控制器。
-
示例项目结构
假设我们有一个简单的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;
}
}
-
测试环境配置
为了进行单元测试,我们需要配置测试环境。以下是相关的配置代码:
java复制
@EnableWebMvc
@Configuration
@ComponentScan
public class MyWebConfig implements WebMvcConfigurer {
}
-
单元测试代码
我们将分别测试处理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());
}
- 测试结果
运行上述测试代码后,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