zoukankan      html  css  js  c++  java
  • Mockito测试Spring boot接口出现400错误

    Mockito测试Spring boot接口出现400错误

    前言:在学习使用Mockito测试接口的时候,返回结果的状态码总是失败,返回状态码为400,但是使用相同的数据利用postman却可以成功返回,找了很久最后发现似乎是因为在Mockito测试的时候jackson配置没有起到作用,下面是问题的具体描述和解决方案。

    问题展示

    1. 接口代码如图所示:

    image-20210711231552167

    1. 利用postman的测试数据及结果(状态码为200,访问成功):

    image-20210711231707176

    1. 使用MockMvc接口测试代码及测试结果(状态码为400,失败):
    @Test
        public void hellTest() throws Exception{
            String article = "{
    " +
                "    "id":21,
    " +
                  "    "author":"shweng",
    " +
                    "    "title":"spring boot learning",
    " +
                    "    "content":"test learning",
    " +
                    "    "time":"2021-7-7 23:28:00"
    " +
                    "}";
            MvcResult result = mockMvc.perform(
                    MockMvcRequestBuilders
                            .request(HttpMethod.GET,"/Hello/hello")
                            .contentType("application/json")
                            .content(article)
            ).andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.data.id").value(21))
                    .andDo(print())
                    .andReturn();
        }
    

    image-20210711231954163

    问题分析

    400(Bad Request) 表示客户端请求有语法错误,不能被服务器正确的解析。分析可能原因:

    • 输入字符串格式有问题:用postman成功的数据复制进来,还是400状态码,排除。
    • 数据没有设置成正确的JSON格式:尝试contentType("application/json")contentType(MediaType.APPLICATION_JSON)两种,都不可以,感觉也不是这个问题。
    • Controller层json序列化失败:主要考虑到传入数据包含Date数据类型,可能时间格式化不对。原来是在application.yml配置文件中利用jackson进行全局配置,因此postman可以测试正常,配置方法如图所示。image-20210712012650865解决方案1:利用JsonFormat对封装类的时间属性进行局部配置,成功解决问题,代码如图所示(注意:Atricle是接口接收数据的类,对传入的数据进行封装)。image-20210712012938945解决方案2:由于仅仅使用MocjMvc对象模拟HTTP请求没有启动servlet容器和Spring上下文,可能是由于该原因导致全局配置没有生效,通过在测试类添加@SpringBootTest@AutoConfigureMockMvc注解,并将MockMvc对象由原来手动创建改为@Resource依赖注入,不需要方案1的局部配置。重新测试,通过!代码如下:

    总结

    ​ 在spring boot中,@RestController层注解的json默认序列化中,日期格式默认为:2018-06-17T07:24:07.430+0000。因此在传输特定格式的date类型数据之前,需要进行配置。配置方式有两种:(1)修改yml配置文件,利用jackson进行全局配置(2)在封装类的属性上通过@JsonFormat注解进行配置。

    ​ 在本次出现postman测试端口可以过,但是MockMvc接口单元测试过不了(400状态码)的原因可能是全局配置没有起作用,通过@JsonFormat对属性进行局部配置或利用@SpringBootTest@AutoConfigureMockMvc注解启动servlet容器,构建Spring上下文可以解决。


    如有不当之处,欢迎指出,谢谢!

  • 相关阅读:
    Java学习笔记8(面向对象3:接口)
    面向对象2(继承,抽象类)
    java学习笔记6(面向对象1:概念,private)
    排序方法-循环和数组练习
    ArrayList方法综合练习
    Eclipse的配置
    集合(ArrayList)简述
    java学习笔记5(方法)
    数据结构9——最小生成树
    数据结构8——图的遍历
  • 原文地址:https://www.cnblogs.com/wshbolgs/p/15003830.html
Copyright © 2011-2022 走看看