我已经设置了oauth2,并且正在生产中。在控制器的方法中:
fun setCars(@RequestBody carsData: CarsData, authentication: Authentication?) 该authentication参数被正确喷射。但是当我跑步@WebMvcTest去做
mockMvc.perform( put("/api/...") .with(authentication(anAuthentication)) .content("""...""") .contentType(MediaType.APPLICATION_JSON_UTF8) 然后,在控制器的方法中,该authentication参数为null。如何在Web MVC测试中通过身份验证对象?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring Boot应用中,使用@WebMvcTest
进行单元测试时,通常只加载与MVC相关的组件,如控制器、转换器、配置等,而安全上下文(如OAuth2的认证信息)默认是不被加载的。因此,你需要手动配置模拟的安全上下文来确保Authentication
对象能正确注入。
你可以通过以下步骤设置:
import org.springframework.security.test.context.support.WithMockUser
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers
import org.springframework.test.web.servlet.setup.MockMvcBuilders
MockMvc
实例之前,使用SecurityMockMvcConfigurers.springSecurity()
方法来配置它,以便它可以理解并处理与安全相关的注解和请求属性。// 假设yourController是要测试的控制器
val mockMvc = MockMvcBuilders.standaloneSetup(yourController)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build()
withUser
系列方法来创建一个模拟的Authentication
对象,并将其应用于测试请求。mockMvc.perform(
put("/api/...")
.with(SecurityMockMvcRequestPostProcessors.user("username").password("password").roles("USER", "ADMIN"))
.content("""...""")
.contentType(MediaType.APPLICATION_JSON_UTF8)
)
或者,如果你已经有了一个自定义的Authentication
实例(比如你提到的anAuthentication
),可以直接使用它:
mockMvc.perform(
put("/api/...")
.with(SecurityMockMvcRequestPostProcessors.authentication(anAuthentication))
.content("""...""")
.contentType(MediaType.APPLICATION_JSON_UTF8)
)
这样,在执行测试请求时,你的控制器方法应该能够接收到正确的Authentication
对象了。记得根据实际情况调整用户名、密码、角色等信息。