2013-12-10 2 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(); 
} 

방법 I 테스트가 ObjectBean을받을 봄의 @RequestBody를 사용 해요,하지만 테스트가 항상 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 
} 

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 
} 

그래서 내 질문입니다 ObjectBean 클래스 : 어떻게 봄 MockMVC를 사용하여이 방법을 테스트하려면?

+0

후 귀하의'ObjectBean' 클래스와 어떤'json' 요청을 보내기 전에이 포함되어 있습니다. –

+0

님의 의견에 업데이트되었습니다. – Matt

+0

실제 수업을 게시해야합니다. 400으로 Spring은 요청 본문을'ObjectBean' 객체로 변환하는 데 실패하고 있습니다. –

답변

3

응용 프로그램이 Jackson ObjectMapper (MappingJackson2HttpMessageConverter)으로 JSON을 deserialize하려고 시도하는 동안 사용자 정의 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 날짜 형식을 설정하는 것입니다.

MappingJackson2HttpMessageConverter을 등록하려면 ObjectMapperGson과 동일한 날짜 형식으로 구성해야합니다.

+0

감사합니다 Sotirios, 이것은 매우 유용한 교훈입니다. deserialization은 필자가 나열한 형식 (yyyy-mm-dd-hh : mm : ss)을 사용한다고 가정했습니다. @RequestBody가 Jackson을 사용하기 때문입니까? 또한, 이것은 내가 위에 링크 된 내 다른 질문에 대답 ... – Matt

+0

@MattB 두 가지 다른 프로세스가 관련되어 있습니다. 지정한 형식으로 프로세스에서 직렬화하고 있습니다. 자체 형식을 사용하는 별도의 응용 프로그램에서 비 직렬화 할 수 있습니다. –

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()); 
} 
관련 문제