Les essais du Printemps @RequestBody à l'aide de Printemps MockMVC
Je suis en train de tester une méthode qui affiche un objet de la base de données à l'aide du Printemps MockMVC cadre. J'ai construit le test comme suit:
@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();
}
La méthode que je suis en essais utilise du Printemps @RequestBody pour recevoir le ObjectBean, mais le test renvoie toujours une erreur 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;
}
Le json créé par gson dans le test:
{
"objectId":"33",
"userId":"4268321",
//... many more
}
La ObjectBean classe
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
}
Donc ma question est: comment puis-je tester cette méthode à l'aide de Printemps MockMVC?
- Vous devrez poster à la classe réelle. Avec un 400, Printemps, ne parvient pas à convertir votre corps de la requête à un
ObjectBean
objet. - Grâce Sotirios, c'est un format de date question, je suis dans la recherche. Je suis de passage java.util Date et gson ne l'aime pas.
- Salut Sotirios. Ouais, malheureusement, ce problème persiste! J'ai posé une question concernant le format de date ici: stackoverflow.com/questions/20509883/mysql-insert-gson-date
- Quel est le type du champ de date dans la
ObjectBean
classe?java.util.Date
,java.util.Calendar
, ouString
? Ou une autre? - java.util.Date.
Vous devez vous connecter pour publier un commentaire.
Utiliser
Comme décrit dans les commentaires, cela fonctionne parce que l'objet est converti en json et transmis en tant que le corps de la requête. En outre, le contentType est défini comme Json (APPLICATION_JSON_UTF8).
Plus d'infos sur la structure du corps de la requête HTTP
les ouvrages suivants, pour moi,
Le problème, c'est que vous êtes la sérialisation de votre bean avec une coutume
Gson
objet alors que la demande est de tenter de désérialiser votre JSON avec un JacksonObjectMapper
(dansMappingJackson2HttpMessageConverter
).Si vous ouvrez vos journaux de serveur, vous devriez voir quelque chose comme
parmi d'autres traces de pile.
Une solution est de mettre votre
Gson
le format de date pour l'un des ci-dessus (dans la stacktrace).L'alternative est d'enregistrer votre propre
MappingJackson2HttpMessageConverter
par la configuration de vos propresObjectMapper
avoir le même format de date que votreGson
.