在不使用请求参数方法的情况下,在Spring控制器的请求处理程序中模拟@ModelAttribute

时间:2018-01-11 13:24:10

标签: java spring spring-boot junit mockito

我需要在spring控制器的请求处理程序中模拟@ModelAttribute。我希望通过mock传递不同的值,而不是通过MockMVC请求参数传递它。有一个请求拦截器工作,甚至可能是nullyfying甚至模型对象属性是通过请求参数设置的,因此这个问题。

以下是部分代码段; Componet1:要模拟其请求处理程序的@ModelAtrribute的控制器。

@Controller public class MyController { / **这里有一些代码* /

@RequestMapping(path = "/myRequest", method = RequestMethod.POST)
@ResponseBody
public String requestHanderForMyRequest(HttpServletRequest request, @ModelAttribute(name="myBean") People person) {
    ...
    Date birthDate = person.getBirthDate();
    ...
    // do something with date
    /** prepare JSON response and return */
    return "{ ...}";
}

}

组件2:DateFieldInterceptor.java 截取请求中的日期字段并对其进行处理,然后在成功流程重置为null时更新它。

组件3:JUnit测试类中的模拟测试方法

@Test
public void testRequestHanderForMyRequest() {
    try {
        ResponseInstance responseInstance = testUtility .loadResponseFromFile("testFile.json");

        Assert.assertNotNull("No base data", responseInstance);

        MvcResult resultantMvc = mockMvc.perform(post("/myRequest")
                                                    .session(mockHttpSession)
                                                .param(START_DATE, START_DATE_VALUE)
                                                .param("birthdate", BIRTH_DATE_VALUE)
                                                .param("personName", "dfs edfsd")
                                                )
                                        .andExpect(status().isOk())
                                        .andExpect(jsonPath("$").exists())
                                        .andExpect(jsonPath("$").isNotEmpty())
                                        .andExpect(jsonPath("$", Matchers.hasKey(PAYLOAD)))
                                        .andExpect(jsonPath("$.*", Matchers.hasSize(1)))
                                        .andExpect(jsonPath(JSON_PATH_ROOT_PAYLOAD).isArray())
                                        .andExpect(jsonPath(JSON_PATH_ROOT_PAYLOAD).isNotEmpty())
                                        .andReturn();
        Assert.assertNotNull(MVC_RESULT_IS_MISSING_FOR_THE_REQUEST, resultantMvc);

        String payloadData = resultantMvc.getResponse().getContentAsString();

        Assert.assertTrue(RESPONSE_IS_MISSING_PAYLOAD_DATA, StringUtils.isNotBlank(payloadData));
    } catch (Exception e) {
        Assert.fail(e.getMessage());
    }
}

日期拦截器以某种方式进入负流并将日期字段重置为null。 我希望单元测试People实例的birthdate字段。 如果我能以某种方式模拟person.getBirthDate()那么我应该对单元测试没问题。 但是模拟似乎不适用于@ModelAttribute参数。

0 个答案:

没有答案