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 P> et voici mon code de test: p> Les résultats de l'Ando (Imprimer ( )) sont les suivants: p> 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? p> p>
4 Réponses :
Un 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> L'essentiel ici est le paramètre Alors voyons la demande que vous faites p> httpmessagenotradeadableException code> est
@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> requestPaymentController.setLoginService(mockLoginService);
requestPaymentController.handleRequestPayment(mockPaymentRequest, mockHttpServletRequest, mockHttpServletResponse, mockBindingResult);
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!
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. P>
C'est à dire, 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é. P>
semble dupliqué ici> Printemps httpmessagenotreadableException . em> p> p>
Assurez-vous de ce qui suit: P>
@Responsebody code> Annotation utilisée sur la méthode du contrôleur LI>
-
sur votre test de votre appareil p>
@extendwith (Springextension.Class)
@ContextConfiguration (classes = {....})
@Webmvctest
@Autoconfiguremockmvc P> LI>
ul>
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>