2015-01-30 22 views
6

Spring MVC kullanılarak oluşturulan çok basit bir REST uygulamasına sahibim. (Kod GitHub mevcuttur.) Aşağıdaki gibi basit bir WebSecurityConfigurer sahiptir:Birim MockMvc kullanarak Spring MVC'de test etme/oturum açma

@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); 
} 

Ben özel denetleyicileri ve giriş hem uygulamayı çalıştırdığınızda/çıkış sayfaları sorunsuz çalışır. MockMvc aracılığıyla unit test/user/new'u bile yapabilirim.

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> 

Ama testin yerine uygulamayı çalıştırdığınızda oldukça kullanıcıya POST çalışıyor /login için duyuyorum: Ancak, ne zaman şöyle başarısız aşağıdaki fonksiyonu

@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")); 
} 

ile /login test etmeye çalışacağım. Ayrıca, bir GET veya HEAD isteğini (günlüğün Headers = {Allow=[HEAD, GET]} satırında önerildiği gibi) yapmaya çalıştığımda, bu sefer 404 alırsınız. Neler olup bittiği hakkında herhangi bir fikir ve nasıl giderebilirim?

+0

Inanıyorum/giriş URL'si bahar güvenlik filtresi ile işlenir ve test ayarınız sırasında – sodik

cevap

5

Şimdi github bağlantısını fark ettim. Testleriniz için güvenlik filtresini de yapılandırmanız gerektiğine inanıyorum.

mockMvc = MockMvcBuilders.webApplicationContextSetup(webApplicationContext) 
       .addFilter(springSecurityFilterChain) 
       .build(); 

gibi bir şey Bazı ek ayarlar ilham için http://www.petrikainulainen.net/programming/spring-framework/integration-testing-of-spring-mvc-applications-security/ kontrol edebilirsiniz, gerekli olabilir.

+1

'u "yapılandırdığınızdan" emin değilim, bu sefer HTTP kodu 200 ile aşağıdaki MockHttpServletResponse'yi alıyorum, ancak tanımlama bilgisi eksik . Durum = 200 Hata iletisi = null Üstbilgiler = {X-Content-Type-Options = [nosniff], X-XSS-Protection = [1; mode = block], Önbellek Denetimi = [no-cache, no-store, maks-age = 0, mutlaka-revalidate], Pragma = [no-cache], Expires = [0], X-Frame-Options = [ DENY]} İçerik tip = null Vücut = Yönlendirilen URL = null yönlendirildi URL = null Çerezler = [] –

4

Form tabanlı oturum açmayı test etmek için yay güvenlik testi sınıflarını kullanabilirsiniz. Form tabanlı girişleri test etmek için aşağıdakileri yapmanız gerekir.

Maven bağımlılık:

<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-test</artifactId> 
    <version>4.0.0.M1</version> 
    <scope>test</scope> 
</dependency> 

<repositories> 
    <repository> 
     <id>spring-snasphot</id> 
     <url>https://repo.spring.io/libs-snapshot</url> 
    </repository> 
</repositories> 

Testi sınıfı:

import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin; 

RequestBuilder requestBuilder = formLogin().user("username").password("passowrd"); 
mockMvc.perform(requestBuilder) 
    .andDo(print()) 
    .andExpect(status().isOk()) 
    .andExpect(cookie().exists("JSESSIONID")); 
+0

hala 405. ben '.addFilter (springSecurityFilterChain) kullanan olsun' @sodik önerildiği gibi, bu kez 200 tane aldım ama kurabiye eksik. (Bkz. @sodik'e yaptığım yorumu görün.) –

1

burada Yazımın ardından: Ben UsernamePasswordAuthenticationToken ile DİNLENME API oluşturulması yönetmek zorunda Spring MockMvcBuilders Security filter

/oauth/jeton ama ben korunan kaynağım için test oluşturmayı başaramadı (çalışan sunucuda iyi çalışıyor). Bize REST arayüzünüzü gösterebilir misiniz?

+0

Tüm kod [GitHub] adresinde (https://github.com/tanidiktan/backend) mevcuttur. –