2016-07-30 2 views
5

Я пытаюсь проверить @WebMvcTest с пользовательскими настройками безопасности, определенным в SecurityConfig классе:Тестирование безопасности в Спринг Ботинок 1,4

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

тестовый класс:

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

тесты не потому, что они используют настройки безопасности по умолчанию для Spring Boot.

Я могу исправить это, используя @SpringBootTest + @AutoConfigureMockMvc, но было бы интересно протестировать без запуска всей автоматической настройки.

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.MOCK) 
@AutoConfigureMockMvc 
public class ExampleControllerSpringBootTest { 

    @Autowired 
    private MockMvc mockMvc; 

    // tests 
} 

Есть ли способ, что @WebMvcTest могут использовать параметры, определенные в классе SecurityConfig?

+0

просто добавьте это в «application.properties» (в разделе «src/main/resources»): security.user.password = пароль (и выберите свой собственный пароль) –

+1

Спасибо, но не исправим ... все еще используя настройки безопасности по умолчанию, но заставляя пароль «пароль». Я просто защищаю «/ admin *» URI, используя роль «ADMIN», конфигурация безопасности по умолчанию защищает все URI, используя роль «ПОЛЬЗОВАТЕЛЬ». – dmunozfer

+0

Спасибо за комментарий Дэвид. Я не знал о защите по умолчанию, защищающей все URI с помощью 'USER'. – Snekse

ответ

7

WebMvcTest только загрузит ваш контроллер и ничего больше (поэтому мы называем это срезанием). Мы не можем понять, какая часть вашей конфигурации вам нужна, а какая - нет. Если конфиг безопасности не находится на вашем основном @SpringBootApplication, вам придется импортировать его явно. В противном случае Spring Boot включит параметры безопасности по умолчанию.

Если вы используете что-то вроде OAuth, это хорошо, потому что вы действительно не хотите использовать это для макетного теста. Что произойдет, если вы добавите @Import(SecurityConfig.class) к вашему тесту?

+1

FYI: есть также связанная дискуссия в трекере загрузки Boot Boot: https://github.com/spring-projects/spring-boot/issues/6514 –