J'ai un test d'intégration simple
@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName() throws Exception {
mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON)
.content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}"))
.andDo(print())
.andExpect(status().isBadRequest())
.andExpect(?);
}
Dans la dernière ligne, je veux comparer la chaîne reçue dans le corps de la réponse à la chaîne attendue
Et en réponse, je reçois:
MockHttpServletResponse:
Status = 400
Error message = null
Headers = {Content-Type=[application/json]}
Content type = application/json
Body = "Username already taken"
Forwarded URL = null
Redirected URL = null
J'ai essayé quelques astuces avec content (), body () mais rien n'a fonctionné.
java
spring
mocking
spring-test-mvc
pbaranski
la source
la source
"Username already taken"
. Cela devrait être davantage un conflit 409.Réponses:
Vous pouvez appeler
andReturn()
et utiliser l'MvcResult
objet renvoyé pour obtenir le contenu en tant queString
.Voir ci-dessous:
la source
@RestController
indique que toutes les méthodes de gestionnaire sont implicitement annotées avec@ResponseBody
. Cela signifie que Spring utilisera unHttpMessageConverter
pour sérialiser la valeur de retour du gestionnaire et l'écrire dans la réponse. Vous pouvez très bien obtenir le corpscontent()
.getContentAsString()
celui qui vient de mon@RestController
contrôleur annoté.result.getResponse().getErrorMessage()
andReturn
renvoie unMvcResult
, comme spécifié dans le javadoc ici .La réponse de @Sotirios Delimanolis fait le travail mais je cherchais à comparer les chaînes dans cette assertion mockMvc
Alors voilà
Bien sûr, mon affirmation échoue:
car:
Voilà donc la preuve que ça marche!
la source
.andExpect(content().string(containsString("\"Username already taken");
org.hamcrest.Matchers.containsString()
.org.hamcrest.Matchers.equalToIgnoringWhiteSpace()
matcher pour ignorer tous les caractères d'espacement. Peut-être que ce sera un conseil utile pour quelqu'unSpring MockMvc prend désormais en charge directement JSON. Vous dites donc simplement:
et contrairement à la comparaison de chaînes, il dira quelque chose comme "champ manquant xyz" ou "message Attendu" ok "a" nok ".
Cette méthode a été introduite au printemps 4.1.
la source
ContentRequestMatchers
pas besoin de prendre également en charge cette fonctionnalité?En lisant ces réponses, je vois beaucoup de choses concernant Spring version 4.x, j'utilise la version 3.2.0 pour diverses raisons. Des choses comme le support json directement depuis le
content()
n'est pas possible.J'ai trouvé que l'utilisation
MockMvcResultMatchers.jsonPath
est vraiment facile et fonctionne un régal. Voici un exemple de test d'une méthode de publication.Le bonus de cette solution est que vous êtes toujours en correspondance avec des attributs, sans compter sur des comparaisons de chaînes json complètes.
(Utilisation
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)Le corps de la requête n'était qu'une chaîne json, que vous pouvez facilement charger à partir d'un vrai fichier de données fictives json si vous le vouliez, mais je ne l'ai pas inclus ici car cela aurait dévié de la question.
Le json retourné aurait ressemblé à ceci:
la source
Extrait du tutoriel du printemps
is
est disponible à partir deimport static org.hamcrest.Matchers.*;
jsonPath
est disponible à partir deimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
et la
jsonPath
référence peut être trouvée icila source
error: incompatible types: RequestMatcher cannot be converted to ResultMatcher
pour.andExpect(content().contentType(contentType))
@WithMockUser
LecontainsString
matcher de Spring Security et Hamcrest constitue une solution simple et élégante:Plus d'exemples sur github
la source
Voici un exemple comment analyser la réponse JSON et même comment envoyer une demande avec un bean sous forme JSON:
Comme vous pouvez le voir ici, il
Book
s'agit d'un DTO de demande et d'UpdateBookResponse
un objet de réponse analysé à partir de JSON. Vous souhaiterez peut-être modifier laObjectMapper
configuration de Jakson .la source
Cela devrait vous donner le corps de la réponse. "Nom d'utilisateur déjà pris" dans votre cas.
la source
ici une manière plus élégante
la source
Vous pouvez utiliser la méthode «getContentAsString» pour obtenir les données de réponse sous forme de chaîne.
Vous pouvez renvoyer ce lien pour l'application de test.
la source
Une approche possible consiste à simplement inclure la
gson
dépendance:et analyser la valeur pour effectuer vos vérifications:
la source