首页 > 解决方案 > SpringBootTest 与 Zuul 代理 - 空响应

问题描述

简介: 我目前正在使用 SpringBootTest 为我的带有 Zuul 代理的 API 网关编写集成测试。我已经在8089返回一些 json 数据的端口上创建了一个有效的模拟微服务,网关应用程序应该将传入的请求转发到该端口。

问题: Zuul 设法正确匹配路由,但是它以某种方式无法转发请求,因为响应始终是空的 HTTP 200,而它应该包含模拟微服务返回的 json 数据。此问题仅在 test 中出现。它在生产中运行良好。

最近的观察:在调试时我发现在测试中,FilterLoader不提供任何类型的过滤器route,而在生产中它提供了三个过滤器的列表,然后route()ZuulServlet. 处理该route()方法后,将使用从微服务获得的数据填充响应。它不会在测试中发生。

我还尝试用真实的服务器替换模拟服务器 - 结果完全相同。

问题: 我将不胜感激有关此问题的任何建议;)

祖尔配置:

logging:
  level:
    org:
      springframework:
        cloud:
          netflix: trace
ribbon:
  eureka:
    enabled: false
eureka:
  client:
    enabled: false
zuul:
  routes:
    restuarant:
      path: /restaurant/**
      url: http://localhost:8089
spring:
  cloud:
    discovery:
      enabled: false
  ...

测试类注释:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
@AutoConfigureWebTestClient(timeout = "30000")

调用测试的端点

//the mocked microservice has an endpoint http://localhost:8089/restaurants
private WebTestClient.ResponseSpec getResource(String accessToken) {
    return webClient.get()
        .uri("/restaurant/restaurants")
        .accept(MediaType.APPLICATION_JSON)
        .header(HttpHeaders.AUTHORIZATION, TokenType.BEARER.getValue() + " " + accessToken)
        .exchange();
  }

标签: springspring-boottestingproxyforwarding

解决方案


推荐阅读