如何对具有对象 RequestParam 的 Controller 方法进行单元测试?

Posted

技术标签:

【中文标题】如何对具有对象 RequestParam 的 Controller 方法进行单元测试?【英文标题】:How to unit test a Controller method that has a RequestParam of an object? 【发布时间】:2019-08-13 20:53:23 【问题描述】:

我有一个控制器映射

@RequestMapping(value = "/something", method = RequestMethod.GET)
public String get(@RequestParam("id") Person aPerson, Model aModel) 

    aModel.addAttribute("person", aPerson);
    return "index";

如何通过 MockMvc 进行测试?

我可以做这样的事情

mockMvc.perform(get("/something?id=1")).andExpect(status().is2xxSuccessful());

但这不起作用,因为 RequestParam 是一个对象,而不是一个字符串。转换由 Spring 完成,但我正在对该方法进行单元测试,并且不想启动应用程序上下文。如何使用 MockMvc 对这样的东西进行单元测试?

【问题讨论】:

如果您必须记录您的 HTTP API 以便客户端可以使用它,您会怎么做?你会说哪些参数可以传递?如果你不知道,那就有问题了,因为你不知道你创建的 API 可以如何使用。如果您知道,那么您就有了答案:发送您的 API 期望的参数:您的测试是您的 API 的客户端。您使用 POJO 来收集它们的事实是一个实现细节。 我正在为一些遗留代码编写缺少的单元测试,所以我没有编写控制器。我可以在不使用 MockMvc 的情况下轻松地对其进行单元测试,只需调用该方法并断言 String 响应是正确视图的路径,同时验证模型是否包含属性“person”。我的问题是如何通过 MockMvc 来完成,因为我养成了使用上述模式编写所有其他单元测试的习惯。 API 需要一个名为“id”的参数。查看 Person 的代码就知道这个 ID 的类型应该是什么。 @JohnDoe 你看过我的回答了吗?应该工作。 【参考方案1】:

你可以试试

    @Test
    public void test() throws Exception 
       Model model= new Model();
       mockMvc.perform(MockMvcRequestBuilders.get("/something?id=1")
         .content(asJsonString(model))
         .contentType(MediaType.APPLICATION_JSON)
         .accept(MediaType.APPLICATION_JSON)).andExpect(status().is2xxSuccessful());
    

【讨论】:

以上是关于如何对具有对象 RequestParam 的 Controller 方法进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Spring中将@RequestParam绑定到对象

spring 注解上传文件 @RequestParam

Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

SpringMVC 基于注解的Controller @RequestMapping @RequestParam

如何在 Spring MVC 中将 JSON 有效负载发布到 @RequestParam

Spring MVC:复杂对象作为 GET @RequestParam