2017-08-07 2 views
0

J'essaye de simuler une demande de publication en utilisant le code ci-dessous.Spring MockMvc redirection ne fonctionne pas

Je teste une demande de connexion de sécurité printemps. Le code fonctionne bien et après la connexion réussie, je redirige vers un autre contrôleur.

@Override 
     public void onAuthenticationSuccess(HttpServletRequest request, 
       HttpServletResponse response, Authentication authentication) throws IOException, 
       ServletException { 

RequestDispatcher rd = request.getRequestDispatcher("/myURL"); 
     rd.forward(request, response); 

    } 

Lorsque j'exécute le test, j'obtiens les journaux ci-dessous. La redirection ne se produit pas et le contrôleur mappé à/myURL n'est pas appelé.

11:59:55.839 [main] DEBUG o.s.mock.web.MockRequestDispatcher - MockRequestDispatcher: forwarding to [/myURL] 
11:59:55.841 [main] DEBUG o.s.s.w.c.HttpSessionSecurityContextRepository - The HttpSession is currently null, and the HttpSessionSecurityContextRepository is prohibited from creating an HttpSession (because the allowSessionCreation property is false) - SecurityContext thus not stored for next request 
11:59:55.841 [main] DEBUG o.s.s.w.c.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed 

Aucune erreur signalée.

Ai-je raté quelque chose? La redirection ne se produira-t-elle pas lors de l'utilisation de MockMvc?

+0

Comment construisez-vous une instance de MockMvc? Quelle version de Spring Security? – holmis83

+0

a mis à jour la question avec des détails pertinents. J'utilise la sécurité de printemps 4.1.2 – lives

Répondre

2

La redirection ne se produira-t-elle pas lors de l'utilisation de MockMvc?

NO.

Ce qui suit est tiré directement de la section Differences between Out-of-Container and End-to-End Integration Tests du manuel de référence.

choses qui peuvent vous attraper par surprise sont qu'il n'y a pas de chemin de contexte par défaut, aucun cookie jsessionid, pas de transfert, erreur ou dépêches async, et donc pas rendu JSP réelle. Au lieu de cela, les URL "redirigées" et "redirigées" sont sauvegardées dans MockHttpServletResponse et peuvent être affirmées avec des attentes.

Ainsi, tout ce que vous pouvez faire est de vérifier qu'un avant aurait lieu dans un conteneur réel Servlet, et vous le faites en invoquant andExpect(forwardedUrl("/myURL")) au lieu de andReturn(). Notez que forwardedUrl est une méthode statique dans MockMvcResultMatchers.

+0

Merci pour la clarification. – lives