1. 程式人生 > 其它 >Mockito測試Spring boot接口出現400錯誤

Mockito測試Spring boot接口出現400錯誤

Mockito測試Spring boot接口出現400錯誤

前言:在學習使用Mockito測試介面的時候,返回結果的狀態碼總是失敗,返回狀態碼為400,但是使用相同的資料利用postman卻可以成功返回,找了很久最後發現似乎是因為在Mockito測試的時候jackson配置沒有起到作用(原因暫時不知道,如果有朋友知道麻煩在評論區告知,感激不盡!),下面是問題的具體描述和解決方案。

問題展示

  1. 介面程式碼如圖所示:
  1. 利用postman的測試資料及結果(狀態碼為200,訪問成功):
  1. 使用MockMvc介面測試程式碼及測試結果(狀態碼為400,失敗):
@Test
    public void hellTest() throws Exception{
        String article = "{\n" +
            "    \"id\":21,\n" +
              "    \"author\":\"shweng\",\n" +
                "    \"title\":\"spring boot learning\",\n" +
                "    \"content\":\"test learning\",\n" +
                "    \"time\":\"2021-7-7 23:28:00\"\n" +
                "}";
        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();
    }

問題分析

400(Bad Request) 表示客戶端請求有語法錯誤,不能被伺服器正確的解析。分析可能原因:

  • 輸入字串格式有問題:用postman成功的資料複製進來,還是400狀態碼,排除。
  • 資料沒有設定成正確的JSON格式:嘗試contentType("application/json")contentType(MediaType.APPLICATION_JSON)兩種,都不可以,感覺也不是這個問題。
  • Controller層json序列化失敗:主要考慮到傳入資料包含Date資料型別,可能時間格式化不對。原來是在application.yml配置檔案中利用jackson進行全域性配置,因此postman可以測試正常,配置方法如圖所示。解決方案:
    後利用JsonFormat對封裝類的時間屬性進行區域性配置,成功解決問題,程式碼如圖所示(注意:Atricle是介面接收資料的類,對傳入的資料進行封裝)。

總結

​ 在spring boo中,@RestController層註解的json預設序列化中,日期格式預設為:2018-06-17T07:24:07.430+0000。因此在傳輸特定格式的date型別資料之前,需要進行配置。配置方式有兩種:(1)修改yml配置檔案,利用jackson進行全域性配置(2)在封裝類的屬性上通過@JsonFormat註解進行配置。

​ 在本次出現postman測試埠可以過,但是MockMvc介面單元測試過不了(400狀態碼)的原因可能是全域性配置沒有起作用(具體為什麼不太清楚),通過@JsonFormat

對屬性進行區域性配置可以解決。


如有不當之處,歡迎指出,謝謝!