【问题标题】:How to call Spring Controller's method with @RequestBody from JUNIT test case如何使用 JUNIT 测试用例中的 @RequestBody 调用 Spring Controller 的方法
【发布时间】:2016-06-15 06:44:48
【问题描述】:

我有一个控制器方法。

@RequestMapping(method = RequestMethod.POST)
    @ResponseBody 
    public String uploadFiles(@RequestBody MyModel myModel) {...}

我必须从 JUNIT 测试用例中调用它。

到目前为止,我尝试了不同的方法,其中一些在下面,它给了我

java.lang.AssertionError: Status expected:<200> but was:<415>

MvcResult result;   
            result = getMockMvc().perform(post("/fileUpload"))
                    .andExpect(status().isOk())
                    .andReturn();

result = getMockMvc().perform(post("/fileUpload").accept(APPLICATION_JSON_CHARSET_UTF_8))
                        .andExpect(status().isOk())
                        .andReturn();

我无法在 RequestHeader、RequestParam 或 PathVariable 中传递我的参数。

【问题讨论】:

    标签: java spring-mvc junit


    【解决方案1】:

    你可以试试这个:

    MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON).content(jsonContent)).andReturn();
    

    其中 url = "/fileUpload" 和 jsonContent 是您请求的字符串类型的 json 内容。

    【讨论】:

    • 谢谢@Minh。你的做法也是对的。但我们也可以添加.andExpect(status().isOk())
    【解决方案2】:

    HTTP 状态 415 表示不受支持的媒体类型,这意味着控制器没有收到它所期望的请求媒体类型。

    如果您在 JUnit 测试用例中设置 accept(APPLICATION_JSON_CHARSET_UTF_8),那么您的控制器也应该将 consumes = MediaType.APPLICATION_JSON_UTF8_VALUE 作为其 @RequestMapping 注释的一部分。

    编辑:如果您只是专门询问如何将请求正文附加到您的 junit 测试,您可以添加:

    result = getMockMvc().perform(post("/fileUpload")) .content("payload string") .contentType("application/json; charset=utf-8") .accept(MediaType.APPLICATION_JSON_UTF8_VALUE) .andExpect(status().isOk()) .andReturn();

    【讨论】:

    • 是的,它现在可以工作了。没有设置内容(...)。谢谢
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多