在 Spring Boot 3.2.2 应用程序中,我有一个控制器,它将查看请求中的 Oauth2 令牌,并根据它找到的内容表现出不同的行为。令牌由 Auth0 / Okta 提供。
它按预期工作,但我想为我的控制器编写一个测试:
@WebMvcTest(MembersController::class)
class MembersControllerTest(@Autowired val mockMvc: MockMvc) {
@Test
fun `should return 403 when name in token is unknown`() {
val oauth2User = DefaultOAuth2User(
setOf(), // Authorities
mapOf("sub" to "123", "name" to "someUnknownName", "email" to "[email protected]"),
"sub"
)
mockMvc.post("/api/v1/members") {
with(oauth2Login().oauth2User(oauth2User))
}
.andExpect {
status { isUnauthorized() }
}
}
}
当我运行测试时,出现此错误
错误 org.springframework.boot.SpringApplication -- 应用程序运行 失败 java.lang.IllegalArgumentException:URI 不是绝对的
在调试中,我看到有问题的 URL 是
/.well-known/openid-configuration
.
在堆栈跟踪中,我看到它与
okta
启动器 有关
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:781)
at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:422)
at com.okta.spring.boot.oauth.env.OktaOAuth2PropertiesMappingEnvironmentPostProcessor.postProcessEnvironment(OktaOAuth2PropertiesMappingEnvironmentPostProcessor.java:122)
at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:109)
at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:94)
我没想到会发生这种事
@WebMvcTest
..
有没有办法解决这个问题并使用
@WebMvcTest
?或者我是否需要使用 @SpringBootTest
在更高级别进行测试并使用真实令牌发送真实请求?
在具有 JWT 解码器的 OAuth2 资源服务器
@WebMvcTest
中,您应该 @MockBean JwtDecoder jwtDecoder;
并使用:
SecurityMockMvcRequestPostProcessors.jwt()
来自 spring-security-test
@WithJwt
来自 spring-addons-oauth2-test
免责声明:两者(我自己)都是同一作者,并且与涵盖该主题的这篇 Baeldung 文章相同。