gpt4 book ai didi

java - Spring Boot WebMvc 测试不包括 Spring Security

转载 作者:行者123 更新时间:2023-11-30 06:53:16 26 4
gpt4 key购买 nike

我正在开发一个 Spring Boot MVC 应用程序,它具有一定数量的 Controller 。我的根 Controller 是:

@Controller
@RequestMapping("/")
public class RootController {

@GetMapping
public String showStartPage() {
log.info("GET: Show home page");
return "index";
}
}

我已经成功地为 Controller 实现了 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 Controller 测试都崩溃了。根 Controller 测试的断言错误是:

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 {
...
}

在这种情况下,我的测试加载整个应用程序上下文。

我的问题是:

  1. 如何才能将我的 mvc 测试与身份验证和授权过程分开并仅测试 Controller 的逻辑?
  2. 测试身份验证和授权实现的最佳实践是什么?我是否必须使用 @SpringBootTest 才能达到此目的?
  3. 单独测试我的 Controller 和安全逻辑是一个好的决定吗?

谢谢。

最佳答案

之前提出的方法好像是deprecated在较新版本的 spring 中。

另一方面,相同的功能现在可以用作附加参数。

例如,在我的例子中,我的 WebMvcTest 是从

@RunWith(SpringRunner.class)
@WebMvcTest(ImportController.class)

@RunWith(SpringRunner.class)
@WebMvcTest(value = ImportController.class, secure = false)

一切都很好。

关于java - Spring Boot WebMvc 测试不包括 Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42327923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com