8
votes

MockMVC donnant httpmessagenotreadAnException

J'apprends toujours mon chemin autour des tests et j'essaie d'obtenir un test MockMVC pour travailler pour moi. C'est un simple contrôleur de repos que, à ce stade, ne fait que faire une authentification utilisant des informations de JSON dans le poteau. J'ai effectivement mis en œuvre le code, donc je sais que cela fonctionne car je récupère la réponse correcte avec la bonne entrée et les messages d'erreur que j'ai mis ensemble, à la fois dans un format JSON. Mon problème est que le test continue d'échouer avec une exception httpmessagenotradeadable, même si le code réel fonctionne, alors je suppose que je n'ai pas mon test de test. Toute aide que vous puissiez donner serait génial.

Voici mon contrôleur xxx

et voici mon code de test: xxx

Les résultats de l'Ando (Imprimer ( )) sont les suivants: xxx

Comme vous pouvez le constater, le test passe lorsque je m'attends à un mauvais statut de demande, mais j'ai mis dans la journalisation et je sais que le corps de réponse J'en renvoie a un statut de 200. Comme je l'ai dit, c'est ma première fois avec MockMVC, alors je suppose que je n'ai pas donné quelque chose à droite. Aucune suggestion?


0 commentaires

4 Réponses :


14
votes

Un httpmessagenotradeadableException code> est

projeté par httpmessageconverter implémentations lorsque la méthode de lecture échoue. p> blockQuote>

Vous obtenez également une mauvaise demande de 400 mauvaises demande dans votre réponse. Cela devrait tout vous dire que vous n'envoyez pas ce que votre serveur attend. Quel est votre serveur attendre? P> xxx pré>

L'essentiel ici est le paramètre @requestbody code> annoté. Vous indiquez donc à votre serveur d'essayer de désérialiser une instance PaymentRequest de code> à partir du corps de la demande de courrier http. P>

Alors voyons la demande que vous faites p>

requestPaymentController.setLoginService(mockLoginService);
requestPaymentController.handleRequestPayment(mockPaymentRequest, mockHttpServletRequest, mockHttpServletResponse, mockBindingResult);


3 commentaires

Merci, Sotirios! Tout cela a du sens, maintenant je vais juste jouer avec le travail. J'apprécie une réponse aussi approfondie. J'ai essayé de trouver un bon exemple de cette mise en place, mais ils étaient tous suffisamment différents de ce que je fais pour rendre difficile de le tirer ensemble.


@COFFEENJAVA La documentation officielle est assez détaillée. Voir ici .


Donc c'est. Ce sera ma lecture pour l'après-midi. Merci encore!



0
votes

Dans mon cas, comme Sprint MVC W / Jackson (Jackson-Mapper-ASL, V-1.9.10) La désérialisation nécessite un analyseur JSON. Et Jackson nécessite un constructeur par défaut pour la désérialisation des messages de demande HTTP, s'il n'y a pas de constructeur par défaut, Jackson aura un problème avec une réflexion et jette httpmessagenoTradeadableException Exception.

C'est à dire, toutes les classes / sous-classes utilisées comme corps de demande, (dans ce cas) nécessite un constructeur par défaut . Cela m'a coûté quelques instants après avoir essayé d'ajouter un convertisseur personnalisé et d'autres suggestions que j'ai eues dans Stackoverflow en vain.

ou vous pouvez ajouter des désérialiseurs personnalisés ou une annotation de mixage pour éviter d'ajouter un constructeur par défaut de manière hiérarchiquement partout. Comme décrit ici: http: // blogs.jisht.com/blogs/2016/09/12/deerialize-json-with-java-parameté-constructor . Vérifiez ceci si vous êtes intéressé.


semble dupliqué ici> Printemps httpmessagenotreadableException .


0 commentaires

0
votes

Assurez-vous de ce qui suit:

  • Objet de retour Implémente Serializable
  • @Responsebody Annotation utilisée sur la méthode du contrôleur
  • sur votre test de votre appareil

    @extendwith (Springextension.Class) @ContextConfiguration (classes = {....}) @Webmvctest @Autoconfiguremockmvc


0 commentaires

0
votes

Probablement trop tard pour répondre, mais juste au cas où quelqu'un examine toujours cette page.

Comme @sotirios Delimanolis mentionne, le problème est dû à une mauvaise demande - A « @Requestbody em> ' est spécifié dans le paramètre mais jamais fourni dans le corps de la demande. Donc, si vous ajoutez cela à la demande Utilisation de ' contenu (Somerequeststring) em>' comme ci-dessous, cela devrait fonctionner. P>

<dependency>
  <groupId>com.jayway.jsonpath</groupId>
  <artifactId>json-path</artifactId>
  <version>2.4.0</version>
  <scope>test</scope>      
</dependency>


0 commentaires