Test d'intégration de Spring mvc 3.1 avec support de session
Je suis en utilisant le nouveau printemps-test dans la version 3.1 pour exécuter les tests d'intégration. Il fonctionne vraiment bien, mais je ne peux pas faire la session de travail. Mon code:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/webapp")
@ContextConfiguration({"classpath:applicationContext-dataSource.xml",
"classpath:applicationContext.xml",
"classpath:applicationContext-security-roles.xml",
"classpath:applicationContext-security-web.xml",
"classpath:applicationContext-web.xml"})
public class SpringTestBase {
@Autowired
private WebApplicationContext wac;
@Autowired
private FilterChainProxy springSecurityFilterChain;
@Autowired
private SessionFactory sessionFactory;
protected MockMvc mock;
protected MockHttpSession mockSession;
@Before
public void setUp() throws Exception {
initDataSources("dataSource.properties");
mock = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build();
mockSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());
}
@Test
public void testLogin() throws Exception {
//this controller sets a variable in the session
mock.perform(get("/")
.session(mockSession))
.andExpect(model().attributeExists("csrf"));
//I set another variable here just to be sure
mockSession.setAttribute(CSRFHandlerInterceptor.CSRF, csrf);
//this call returns 403 instead of 200 because the session is empty...
mock.perform(post("/setup/language")
.session(mockSession)
.param(CSRFHandlerInterceptor.CSRF, csrf)
.param("language", "de"))
.andExpect(status().isOk());
}
}
Ma session est vide à chaque demande, je ne sais pas pourquoi.
EDIT: La dernière assertion est défaut: andExpect(status().isOk());
. Il retourne 403 au lieu de 200.
source d'informationauteur islon
Vous devez vous connecter pour publier un commentaire.
Je l'ai fait de manière un peu détournée de façon fonctionne bien. Ce que j'ai fait a été de laisser Ressort de Sécurité de créer une session avec les attributs de Sécurité peuplé de la session et puis, prenez la session de cette façon:
SessionHolder est ma classe personnalisée, juste pour tenir la session:
et SessionWrapper est une autre classe s'étendant à partir de MockHttpSession, juste parce que la session méthode nécessite MockHttpSession:
Avec ce jeu, maintenant vous pouvez simplement prendre la session à partir de la sessionHolder et d'exécuter les autres méthodes, par exemple. dans mon cas:
MISE À JOUR DE RÉPONSE:
Il semble une nouvelle méthode "sessionAttrs" a été ajouté pour le constructeur (voir mvc contrôleur de test avec des attributs de session)
VIEILLE RÉPONSE:
ici est une solution plus simple pour obtenir le même résultat sans l'aide de classes de support, c'est un extrait de mon code (je ne sais pas si ces méthodes avaient été déjà disponible lorsque Biju Kunjummen répondu):