D'écriture de test JUnit pour @ExceptionHandler
Je suis en train d'écrire un Repos de service à l'aide de Spring MVC. Voici le plan de la classe:
@Controller
public class MyController{
@RequestMapping(..)
public void myMethod(...) throws NotAuthorizedException{...}
@ExceptionHandler(NotAuthorizedException.class)
@ResponseStatus(value=HttpStatus.UNAUTHORIZED, reason="blah")
public void handler(...){...}
}
J'ai écrit mes tests unitaires à l'aide de la conception posté ici. Le test est fondamentalement comme suit:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(....)
public class mytest{
MockHttpServletRequest requestMock;
MockHttpServletResponse responseMock;
AnnotationMethodHandlerAdapter handlerAdapter;
@Before
public void setUp() {
requestMock = new MockHttpServletRequest();
requestMock.setContentType(MediaType.APPLICATION_JSON_VALUE);
requestMock.addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
responseMock = new MockHttpServletResponse();
handlerAdapter = new AnnotationMethodHandlerAdapter();
}
@Test
public void testExceptionHandler(){
//setup ....
handlerAdapter.handle(...);
//verify
//I would like to do the following
assertThat(responseMock.getStatus(), is(HttpStatus.UNAUTHORIZED.value()));
}
}
Toutefois, l'appel à handle
est de lancer le NotAuthorizedException
. J'ai lu que c'est par la conception pour être en mesure de test de l'unité que la méthode renvoie l'exception appropriée, cependant, j'aimerais écrire un test automatisé que le cadre est de la manipulation de cette exception de façon appropriée et que la classe sous test a mis en oeuvre le gestionnaire de façon appropriée. Est-il un moyen de faire cela?
S'il vous plaît être conscient que je n'ai pas accès au code actuel dans un endroit où je pourrais le poster.
Aussi, je suis limité (pour des raisons malheureuses) de Printemps 3.0.5 ou 3.1.2.
Je suggère que les tests de dépistage de la présence d'
@ExceptionHandler
et que j'ai configuré le cadre correctement via un test automatisé est précieux.Certes, mais qui pourrait être au-delà de la portée d'une unité de test. Rappelons qu'en plus de vos jUnit test, vous allez avoir besoin d'un correctement configuré printemps fichier de configuration. De Plus, vos tests peuvent avoir à changer une fois que vous avez mise à niveau au Printemps. En général, j'ai constaté que si j'ai configuré le cadre correctement une fois, j'ai tendance à configurer correctement partout, ou bien il y a un peu fail rapide qui se produit immédiatement lorsque j'essaie de déployer mon application.
Vous pouvez également envisager que le cadre lui-même a une liste exhaustive des tests unitaires, qui est disponible pour votre inspection à tout moment.
Je dirais que ce que je suis en train de tester n'est pas le cadre, mais que j'ai les annotations mis en place correctement. C'est ce qui est le cône dans le cas de
@RequestMapping
à l'aide de la AnnotationMethodHandlerAdapter
. Je suis à la recherche pour le même genre de test de mon @ExceptionHandler
annotation, un test automatisé que le code de réponse est renvoyée avec le message approprié. Ce n'est pas de tester le framework, mais mon code. Je pourrais faire la réflexion à regarder pour les annotations dans la classe et vérifier qu'ils sont corrects, mais il semble comme il devrait y avoir une meilleure façon.OriginalL'auteur John B | 2013-01-30
Vous devez vous connecter pour publier un commentaire.
Envisager d'utiliser le Printemps 3.2 et ses mvc-test-cadre
Contrôleur de code
Ce "test" passe bien.
Avertissement: actuellement, je suis un noob dans Spring MVC tests, en fait c'est mon premier essai.
upd: Grâce à La Drake pour la correction.
Ce n'est pas de travail pour moi, je suis en utilisant
MockMvcBuilders.standaloneSetup()
OriginalL'auteur Boris Treukhov
D'annoter vos Exception de la Manipulation de contrôleur avec
@ControllerAdvice
au lieu de@Controller
.Boris Treukhov noté lors de l'ajout de la
@ExceptionHandler
annotation à une méthode du contrôleur qui lève l'exception de la faire fonctionner, mais seulement à partir de ce contrôleur spécifique.@ControllerAdvice
permettra à votre exception handeling méthodes applicables pour l'ensemble de votre demande et pas seulement un contrôleur spécifique.OriginalL'auteur Jonas Geiregat
Vous pouviez changer @Test de
Ce serait retourner true si les données internes jeter de cette exception, et false sinon.
Cela permettrait également de faire le assertThat() est inutile. Vous pourriez écrire un deuxième test qui attrape le NotAuthorizedException ensuite, vous pouvez inspecter le responseMock en vertu de cette condition.
ExpectedException
règle pour ce faire. Cela permet tout simplement le test à passer lorsque l'exception est levée, il ne teste pas que le cadre est bien en passant de l'exception à la@ExceptionHandler
méthode.Si vous utilisez un ExpectedException règle générale, il n'est pas dans votre posté poste n'importe où et aurait été bien de liste. Comme @flup dit ensuite, testez votre propre code, pas le cadre.
Il n'est pas dans la liste, car il ne permet pas de résoudre le problème.
OriginalL'auteur Joe