Spring MVC, les Contrôleurs de Test de l'Unité de ne pas l'appel de @ControllerAdvice
J'ai un ensemble de Contrôleurs de l'application et une classe annotée comme @ControllerAdvice
qui met en place certains éléments de données qui sont utilisés dans chacun de ces contrôleurs. Je suis en utilisant Spring MVC 3.2
et ont Junits pour ces contrôleurs. Quand je lance le Junit le contrôle n'est pas d'aller à la ControllerAdvice
classe wheres il fonctionne très bien si je déployer l'application dans Tomcat
et soumettre une demande via le navigateur.
Pensées, s'il vous plaît?.
- Apprécier une mise à jour sur ce. Je suis confronté problème similaire où @ExceptionHandler(Exception.class) méthode annotée dans un @ControllerAdvice classe n'est pas appelé par unité de test - webAppContextSetup(wac).build(). ExceptionHandler annoté méthode est appelée lorsque déployé comme une application web.
- La bonne réponse à ce problème a changé au fil du temps. Voir @Matt Byrne et sa réponse vers la fin: stackoverflow.com/a/28727831/2288986
Vous devez vous connecter pour publier un commentaire.
Après l'utilisation de la réponse de @eugene-et un autre similaire ici j'ai trouvé les limitations et soulevé une question sur Printemps: https://jira.spring.io/browse/SPR-12751
Comme un résultat, le Printemps de test a introduit la possibilité de s'inscrire
@ControllerAdvice
classes dans le générateur dans la section 4.2. Si vous utilisez Printemps de Démarrage alors vous aurez besoin 1.3.0 ou plus.Avec cette amélioration, si vous utilisez le programme d'installation autonome, alors vous pouvez définir un ou plusieurs
ControllerAdvice
instances comme suit:Remarque: le nom
setControllerAdvice()
ne peut pas se rendre immédiatement évident, mais vous pouvez passer beaucoup de cas, puisqu'il a une var-args signature.Supposons que vous avez la classe MyControllerAdvice annotée avec @ControllerAdvice qui possède des méthodes annotées avec @ExceptionHandler. Pour MockMvc vous pouvez facilement ajouter cette classe en tant qu'exception de résolution.
MessageConverter
s pour votreexceptionResolver
si votre résolveur renvoie un objet quelconque. Voir cette réponse par un exemple: stackoverflow.com/a/25881974/945789J'ai eu le même problème lorsque vous essayez de tester
ExceptionHandler
annoté avec@ControllerAdvice
. Dans mon cas, j'ai dû ajouter@Configuration
fichier avec@EnableWebMvc
annotation à@ContextConfiguration
sur la classe de test.Donc mon test ressemblait à ceci:
Avec
@EnableWebMvc
configuration de mon test réussi.@WebAppConfiguration @ContextConfiguration ... @EnableWebMvc public class TestRestProcessingExceptionHandler {
J'ai été aux prises avec la même chose pour un certain temps. Après beaucoup de creusement, la meilleure référence est le Ressort de la documentation:
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/testing.html#spring-mvc-test-framework
En bref, si vous êtes tout simplement le test d'un contrôleur et de ses méthodes, alors vous pouvez utiliser le 'standaloneSetup' méthode qui crée un simple Spring MVC de configuration. Ce sera pas inclure votre gestionnaire d'erreur que vous annoter avec @ControllerAdvice.
De créer un plus complet Spring MVC configuration ne contenir votre gestionnaire d'erreur, vous devez utiliser la configuration suivante:
mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new MyAppExceptionHandler()).build();
Ce travail est pour moi
@tunguski exemple de code fonctionne mais il est utile de comprendre comment les choses fonctionnent. C'est juste une façon de mettre les choses en place.
@EnableWebMvc
est équivalente à la suivante dans un fichier de configuration spring<mvc:annotation-driven />
Essentiellement pour des choses à travailler, vous devez initialiser Spring Mvc et de charger tous vos contrôleurs de haricots et de références. Ainsi, en suivant pourrait être valide, le programme d'installation ainsi qu'une autre
Suivants est comment vous pouvez l'installation de la classe de test
Et la suite pourrait être le printemps de configuration pour le test
Vous devez fournir plus d'infos, et peut-être quelque peu de code et/ou des fichiers de configuration, avant de vous pouvez vous attendre à des réponses spécifiques. Cela dit, basée sur le peu que vous avez fournis, il semble que les annoté haricot n'est pas chargé.
Essayez d'ajouter les éléments suivants à votre test applicationContext.xml (ou l'équivalent printemps fichier de configuration, si vous en utilisez un).
Sinon, vous devrez peut-être "manuellement" en charge de contextes dans les tests en incluant les annotations suivantes avant de votre classe de test:
Bonne chance!
J'ai rencontré ce problème lors de l'écriture de contrôleur de tests avec spock (groovy). Ma classe de test a été écrit à l'origine comme:
Cela a provoqué ControllerAdvice pour être ignoré. Changer le code de Autowire se moque de la correction du problème.
Je soupçonne que vous devez utiliser asyncDispatch dans votre test; les tests de dépistage réguliers cadre est rompu avec les contrôleurs asynchrones.
Essayez l'approche dans: https://github.com/spring-projects/spring-framework/blob/master/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/AsyncTests.java