You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:42:35