Mockito測試Spring boot接口出現400錯誤
阿新 • • 發佈:2021-07-12
Mockito測試Spring boot接口出現400錯誤
前言:在學習使用Mockito測試介面的時候,返回結果的狀態碼總是失敗,返回狀態碼為400,但是使用相同的資料利用postman卻可以成功返回,找了很久最後發現似乎是因為在Mockito測試的時候j
ackson
配置沒有起到作用(原因暫時不知道,如果有朋友知道麻煩在評論區告知,感激不盡!),下面是問題的具體描述和解決方案。
問題展示
- 介面程式碼如圖所示:
- 利用postman的測試資料及結果(狀態碼為200,訪問成功):
- 使用
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可以測試正常,配置方法如圖所示。解決方案:
總結
在spring boo中,@RestController
層註解的json
預設序列化中,日期格式預設為:2018-06-17T07:24:07.430+0000。因此在傳輸特定格式的date型別資料之前,需要進行配置。配置方式有兩種:(1)修改yml
配置檔案,利用jackson
進行全域性配置(2)在封裝類的屬性上通過@JsonFormat
註解進行配置。
在本次出現postman測試埠可以過,但是MockMvc
介面單元測試過不了(400狀態碼)的原因可能是全域性配置沒有起作用(具體為什麼不太清楚),通過@JsonFormat
如有不當之處,歡迎指出,謝謝!