我正在開發一個具有一定數量控制器的Spring Boot MVC應用程序。 我的根控制器:Spring Boot WebMvc測試不包括Spring Security
@Controller
@RequestMapping("/")
public class RootController {
@GetMapping
public String showStartPage() {
log.info("GET: Show home page");
return "index";
}
}
我已經成功地實施了控制器MVC測試。我RootController測試是:
@RunWith(SpringRunner.class)
@WebMvcTest(RootController.class)
public class RootControllerMvcTest {
@Autowired
private MockMvc mvc;
@Test
public void testRoot() throws Exception {
mvc.perform(get("/").accept(MediaType.TEXT_HTML))
.andExpect(status().isOk())
.andExpect(view().name("index"));
}
}
問題:
但是,當我介紹Spring Security認證和授權,所有的MVC控制器測試拋錨。根控制器測試斷言錯誤是:
java.lang.AssertionError: Status
Expected :200
Actual :401
我的安全配置是:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/fonts/*").permitAll()
.antMatchers("/user/**").hasAuthority("ADMIN")
.anyRequest().fullyAuthenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.usernameParameter("email")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.deleteCookies("remember-me")
.logoutSuccessUrl("/")
.permitAll()
.and()
.rememberMe();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}
}
解決方法:
然後,我設法解決這個問題:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class RootControllerMvcTest {
...
}
在這種情況下,我的測試會加載整個Application上下文。
我的問題是:
- 怎麼可能讓我從控制器的認證和授權過程,測試僅邏輯分離MVC測試?
- 測試認證和授權實施的最佳實踐是什麼?我是否必須爲此使用@SpringBootTest?
- 單獨測試我的控制器和安全邏輯是否是一個很好的決定?
謝謝。
[簡單測試Spring Boot安全性]的可能重複(http://stackoverflow.com/questions/31812054/testing-spring-boot-security-simply) –
謝謝。這是一個有用的鏈接。但首先,我試圖弄清楚是否可以使用MockMvc測試我的控制器,而不使用Spring Security。 –