如何测试Spring Cloud断路器过滤器?示例代码与测试困境
正确测试Spring Cloud Gateway + Resilience4J断路器过滤器的方案
1. 确保测试环境加载完整配置
测试类需启用Gateway与Resilience4J的自动配置,避免遗漏核心注解:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @EnableResilience4J class GatewayCircuitBreakerTest { @Autowired private WebTestClient webTestClient; // 测试逻辑代码 }
2. 模拟下游服务故障
用WireMock搭建模拟服务,返回错误响应或模拟超时,模拟真实故障场景:
@RegisterExtension static WireMockExtension wireMock = WireMockExtension.newInstance() .options(wireMockConfig().dynamicPort()) .build(); @BeforeEach void setupDownstreamMock() { // 配置模拟服务返回500错误 wireMock.stubFor(get(urlEqualTo("/downstream/api")) .willReturn(aResponse() .withStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()))); }
同时在application-test.yml中配置路由指向模拟服务:
spring: cloud: gateway: routes: - id: downstream-route uri: http://localhost:${wiremock.server.port} predicates: - Path=/downstream/** filters: - name: CircuitBreaker args: name: downstreamCircuitBreaker fallbackUri: forward:/fallback resilience4j: circuitbreaker: instances: downstreamCircuitBreaker: failure-rate-threshold: 50 sliding-window-size: 2 wait-duration-in-open-state: 10s
3. 触发断路器并验证Fallback
需多次请求达到故障阈值,验证后续请求触发Fallback:
@Test void circuitBreakerTriggersFallbackOnFailure() { // 前两次请求:触发故障,积累故障次数到阈值 for (int i = 0; i < 2; i++) { webTestClient.get().uri("/downstream/api") .exchange() .expectStatus().is5xxServerError(); } // 第三次请求:断路器打开,直接调用Fallback webTestClient.get().uri("/downstream/api") .exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("Fallback Response"); }
4. 直接验证断路器状态
注入CircuitBreakerRegistry,检查断路器状态是否符合预期:
@Autowired private CircuitBreakerRegistry circuitBreakerRegistry; @Test void circuitBreakerSwitchesToOpenState() { // 发送足够次数的故障请求 for (int i = 0; i < 2; i++) { webTestClient.get().uri("/downstream/api").exchange(); } CircuitBreaker breaker = circuitBreakerRegistry.circuitBreaker("downstreamCircuitBreaker"); assertThat(breaker.getState()).isEqualTo(CircuitBreaker.State.OPEN); }
5. 规避常见测试坑点
- 必须使用
WebTestClient而非RestTemplate,适配Gateway的响应式异步处理逻辑 - 不要用
@MockBean替换Gateway核心组件,会破坏过滤器链完整性 - 确保测试环境加载的Resilience4J配置与生产一致,尤其是故障阈值、滑动窗口等参数
内容的提问来源于stack exchange,提问作者Powet
相关产品推荐
相关产品推荐

