test run mvc example annotation java spring spring-security spring-boot spring-test-mvc

run - test java spring



Prueba de seguridad en Spring Boot 1.4 (1)

Estoy intentando probar @WebMvcTest con configuraciones de seguridad personalizadas definidas en SecurityConfig clase SecurityConfig :

@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/admin*").access("hasRole(''ADMIN'')").antMatchers("/**").permitAll().and().formLogin(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password("password").roles("ADMIN"); } }

La clase de prueba es:

@RunWith(SpringRunner.class) @WebMvcTest(value = ExampleController.class) public class ExampleControllerMockMVCTest { @Autowired private MockMvc mockMvc; @Test public void indexTest() throws Exception { mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")); } @Test public void adminTestWithoutAuthentication() throws Exception { mockMvc.perform(get("/admin")) .andExpect(status().is3xxRedirection()); //login form redirect } @Test @WithMockUser(username="example", password="password", roles={"ANONYMOUS"}) public void adminTestWithBadAuthentication() throws Exception { mockMvc.perform(get("/admin")) .andExpect(status().isForbidden()); } @Test @WithMockUser(username="user", password="password", roles={"ADMIN"}) public void adminTestWithAuthentication() throws Exception { mockMvc.perform(get("/admin")) .andExpect(status().isOk()) .andExpect(view().name("admin")) .andExpect(model().attributeExists("name")) .andExpect(model().attribute("name", is("user"))); } }

Las pruebas fallan porque están usando la configuración de seguridad predeterminada de Spring Boot.

Puedo arreglar esto usando @SpringBootTest + @AutoConfigureMockMvc , pero sería interesante probar sin ejecutar toda la autoconfiguración.

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.MOCK) @AutoConfigureMockMvc public class ExampleControllerSpringBootTest { @Autowired private MockMvc mockMvc; // tests }

¿Hay alguna forma de que @WebMvcTest pueda usar la configuración definida en SecurityConfig clase SecurityConfig ?


WebMvcTest solo cargará su controlador y nada más (por eso llamamos a eso rebanar). No podemos determinar qué parte de la configuración desea y cuál no. Si la configuración de seguridad no está en su aplicación principal @SpringBootApplication , tendrá que importarla explícitamente. De lo contrario, Spring Boot va a habilitar la configuración de seguridad predeterminada.

Si está usando algo como OAuth, eso es bueno porque no quiere comenzar a usarlo para una prueba simulada. ¿Qué sucede si agrega @Import(SecurityConfig.class) a su prueba?