嗨,我有一个spring项目,它具有spring安全性,可以使用OAUTH提供程序对用户进行身份验证,并且我必须使用spring Cloud Contract来构建一个用于消费者测试的模拟服务器。
回购:https://github.com/Isaacwhyuenac/spring-cloud-contract-poc/blob/main/order-service/src/test/java/com/example/producer/BaseClass.java
当我运行./gradlew clean :order-service:contractTest
。抛出以下错误
delegate cannot be null. Ensure a Bean with the name springSecurityFilterChain implementing Filter is present or inject the Filter to be used.
java.lang.IllegalStateException: delegate cannot be null. Ensure a Bean with the name springSecurityFilterChain implementing Filter is present or inject the Filter to be used.
如果你看我的SecurityConfig
https://github.com/Isaacwhyuenac/spring-cloud-contract-poc/blob/main/order-service/src/main/java/com/example/producer/config/SecurityConfig.java
安全过滤器已设置。那么,如何解决这个错误,让我的contractTest
正常运行??
BaseClass存在一些问题。
- 如果您使用的是最新的Spring Boot,使用
@SpringBootTest
就足够了。不需要@ExtendedWith
- 使用Mock环境,设置webEnvironment = Mock
- 如果你决定使用RestAssuredMockMvc,你应该在测试中使用这个mockMvc而不是标准的mockMvc。
- 清理过程中根本不需要
Mockito.reset
。
在WebMvc项目中,排除UserDetailsServiceAutoConfiguration
和SecurityAutoConfiguration
在您的测试上下文中,检查我的例子。
在WebFlux项目中,只排除ReactiveUserDetailsServiceAutoConfiguration
和ReactiveSecurityAutoConfiguration
和ReactiveOAuth2ResourceServerAutoConfiguration
(如果oauth2资源服务器启用)在你的测试代码。
@SpringBootTest
@ImportAutoConfiguration(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class, ReactiveSecurityAutoConfiguration.class})
class YourTest{
}
或测试web控制器。
@WebFluxTest(controller=YourController.calss, excludeAutoConfigurations = {ReactiveUserDetailsServiceAutoConfiguration.class, ReactiveSecurityAutoConfiguration.class})
class YourTest{
}
几年前我创建了一个简单的微服务示例,它使用Spring Cloud Contract和Pact实现了API测试和验证中的CDC模式,检查Spring - Microservice -sample。