Unit-Tests /login in Spring MVC mit MockMvc
Habe ich eine sehr einfache REST-Anwendung erstellt, mit Spring MVC. (Code steht bei GitHub.) Es hat eine einfache WebSecurityConfigurer
wie folgt:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/user/new").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login").permitAll()
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.and()
.logout()
.permitAll()
.logoutSuccessHandler(logoutSuccessHandler);
}
Wenn ich die Anwendung ausführen, werden sowohl die custom-Controller und die login/logout-Seiten arbeiten, ohne ein problem. Ich kann auch unit-test /user/new
über MockMvc
. Jedoch, wenn ich versuche zu testen /login
mit der folgenden Funktion
@Test
public void testUserLogin() throws Exception {
RequestBuilder requestBuilder = post("/login")
.param("username", testUser.getUsername())
.param("password", testUser.getPassword());
mockMvc.perform(requestBuilder)
.andDo(print())
.andExpect(status().isOk())
.andExpect(cookie().exists("JSESSIONID"));
}
scheitert es wie folgt:
MockHttpServletRequest:
HTTP Method = POST
Request URI = /login
Parameters = {username=[test-user-UserControllerTest], password=[test-user-UserControllerTest-password]}
Headers = {}
Handler:
Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler
Async:
Was async started = false
Async result = null
Resolved Exception:
Type = org.springframework.web.HttpRequestMethodNotSupportedException
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
MockHttpServletResponse:
Status = 405
Error message = Request method 'POST' not supported
Headers = {Allow=[HEAD, GET]}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
java.lang.AssertionError: Status expected:<200> but was:<405>
Aber ich bin mir ziemlich Benutzer POST
zu /login
ist zu arbeiten, wenn ich die Anwendung ausführen, anstatt zu testen. Weiter, wenn ich versuche, eine GET
oder HEAD
Anfrage (wie vorgeschlagen in der Headers = {Allow=[HEAD, GET]}
Zeile des logs), diesmal erhalte ich einen 404. Irgendwelche Ideen was Los ist und wie ich es beheben kann?
- Ich glaube /login-URL erfolgt über spring security filter, und ich bin nicht sicher, ob Sie noch "konfiguriert", es während Ihres test-setup
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bemerkte ich auf der github-link jetzt. Ich glaube, Sie brauchen, um die Sicherheit zu konfigurieren filter auch für Ihre tests. So etwas wie
Einige zusätzliche Einstellungen notwendig sein könnte, Sie könnte prüfen, http://www.petrikainulainen.net/programming/spring-framework/integration-testing-of-spring-mvc-applications-security/ für inspiration.
MockHttpServletResponse
mit HTTP-code 200, aber das cookie fehlt. Status = 200 Fehlermeldung = null Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Abgelaufen=[0], X-Frame-Options=[VERWEIGERN]} Content type = " null Body = Weitergeleitet, URL = null Umgeleitet, URL = null Cookies = []Könnten Sie spring security Test von Klassen zu testen, Formular-basierte Anmeldung. Sie müssen Folgendes tun, um test-Formular-basierten Logins.
Maven-dependency:
Test Klasse:
.addFilter(springSecurityFilterChain)
wie @sodik schlug ich dieses mal bekommen Sie 200, aber cookies fehlen. (Siehe mein Kommentar zu @sodik.)Folgenden hier mein post:
Frühjahr MockMvcBuilders Security filter
Habe ich zu verwalten, zu erstellen, REST-API mit UsernamePasswordAuthenticationToken für /oauth-token, aber ich schaffte es nicht zu schaffen den test für meine geschützte Ressource (auf dem server läuft es einwandfrei funktionieren).
Könnten Sie zeigen uns Ihre REST-Schnittstelle ?
Testen SpringSession, erreichte ich um das session-cookie und speichern-Sitzung auf einem embedded-Redis, dies zu tun:
Hoffe, es hilft.