2013-12-10 157 views
22

我想測試一個使用Spring的MockMVC框架將對象發佈到數據庫的方法。我已經構建瞭如下測試:使用Spring MockMVC測試Spring的@RequestBody

@Test 
public void testInsertObject() throws Exception { 

    String url = BASE_URL + "/object"; 

    ObjectBean anObject = new ObjectBean(); 
    anObject.setObjectId("33"); 
    anObject.setUserId("4268321"); 
    //... more 

    Gson gson = new Gson(); 
    String json = gson.toJson(anObject); 

    MvcResult result = this.mockMvc.perform(
      post(url) 
      .contentType(MediaType.APPLICATION_JSON) 
      .content(json)) 
      .andExpect(status().isOk()) 
      .andReturn(); 
} 

我測試使用Spring的@RequestBody接收ObjectBean,但測試總是返回400錯誤的方法。

@ResponseBody 
@RequestMapping( consumes="application/json", 
        produces="application/json", 
        method=RequestMethod.POST, 
        value="/object") 
public ObjectResponse insertObject(@RequestBody ObjectBean bean){ 

    this.photonetService.insertObject(bean); 

    ObjectResponse response = new ObjectResponse(); 
    response.setObject(bean); 

    return response; 
} 

通過GSON測試創建的JSON:

{ 
    "objectId":"33", 
    "userId":"4268321", 
    //... many more 
} 

的ObjectBean類

public class ObjectBean { 

private String objectId; 
private String userId; 
//... many more 

public String getObjectId() { 
    return objectId; 
} 

public void setObjectId(String objectId) { 
    this.objectId = objectId; 
} 

public String getUserId() { 
    return userId; 
} 

public void setUserId(String userId) { 
    this.userId = userId; 
} 
//... many more 
} 

所以我的問題是:如何在我的測試中使用Spring MockMVC這種方法嗎?

+0

安置自己的'ObjectBean'類和什麼'json'包含在發送請求之前。 –

+0

根據你的評論更新 – Matt

+0

你將不得不發佈實際的課程。使用400,Spring未能將您的請求體轉換爲ObjectBean對象。 –

回答

3

問題是,當應用程序嘗試使用Jackson ObjectMapper(在MappingJackson2HttpMessageConverter內)反序列化您的JSON時,您將使用自定義Gson對象序列化bean。

如果你打開你的服務器日誌,你應該看到其他堆棧跟蹤中類似

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.util.Date from String value '2013-34-10-10:34:31': not a valid representation (error: Failed to parse Date value '2013-34-10-10:34:31': Can not parse date "2013-34-10-10:34:31": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")) 
at [Source: [email protected]; line: 1, column: 20] (through reference chain: com.spring.Bean["publicationDate"]) 

一個解決方案是將您的Gson日期格式設置爲上述之一(在堆棧跟蹤中)。

另一種方法是通過將您自己的ObjectMapper配置爲與您的Gson具有相同的日期格式來註冊您自己的MappingJackson2HttpMessageConverter

+0

謝謝Sotirios,這是一個非常有益的教訓。我曾假設反序列化只是採用我列出的格式:yyyy-mm-dd-hh:mm:ss。這是因爲@RequestBody使用傑克遜?此外,這也回答了我上面鏈接的另一個問題... – Matt

+0

@MattB涉及2個不同的過程。您正在使用您指定的格式進行序列化。您正在使用自己格式的單獨應用程序中進行反序列化。 –

18

使用這一個

public static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); 

@Test 
public void testInsertObject() throws Exception { 
    String url = BASE_URL + "/object"; 
    ObjectBean anObject = new ObjectBean(); 
    anObject.setObjectId("33"); 
    anObject.setUserId("4268321"); 
    //... more 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); 
    ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); 
    String requestJson=ow.writeValueAsString(anObject); 

    mockMvc.perform(post(url).contentType(APPLICATION_JSON_UTF8) 
     .content(requestJson)) 
     .andExpect(status().isOk()); 
} 
相關問題