带Zuul代理的SpringBootTest-空响应

带Zuul代理的SpringBootTest-空响应,spring,spring-boot,testing,proxy,forwarding,Spring,Spring Boot,Testing,Proxy,Forwarding,简介: 我目前正在使用SpringBootTest为我的API网关和Zuul代理编写集成测试。 我已经在端口8089上创建了一个正在运行的模拟微服务,返回一些json数据,网关应用程序应该将传入的请求转发到该数据 问题: Zuul设法正确匹配路由,但是它以某种方式转发请求失败,因为响应总是空的HTTP 200,而它应该包含模拟的微服务返回的json数据。 此问题仅在测试中出现。它在生产中运行良好 最近的观察结果:在调试过程中,我发现在测试中,FilterLoader不提供任何类型的route过滤

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

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

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

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

问题: 如果您能就这个问题提供任何建议,我将不胜感激;)

Zuul配置:

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")
测试类注释:

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();
  }