I am trying to test a method that posts an object to the database using Spring's MockMVC framework. I've constructed the test as follows:
@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();
}
The method I'm testing uses Spring's @RequestBody to receive the ObjectBean, but the test always returns a 400 error.
@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;
}
The json created by gson in the test:
{
"objectId":"33",
"userId":"4268321",
//... many more
}
The ObjectBean class
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
}
So my question is: how to I test this method using Spring MockMVC?
the following works for me,
Use this one
As described in the comments, this works because the object is converted to json and passed as the request body. Additionally, the contentType is defined as Json (APPLICATION_JSON_UTF8).
More info on the HTTP request body structure
The issue is that you are serializing your bean with a custom
Gson
object while the application is attempting to deserialize your JSON with a JacksonObjectMapper
(withinMappingJackson2HttpMessageConverter
).If you open up your server logs, you should see something like
among other stack traces.
One solution is to set your
Gson
date format to one of the above (in the stacktrace).The alternative is to register your own
MappingJackson2HttpMessageConverter
by configuring your ownObjectMapper
to have the same date format as yourGson
.