带Zuul代理的SpringBootTest-空响应
简介: 我目前正在使用SpringBootTest为我的API网关和Zuul代理编写集成测试。 我已经在端口带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过滤
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();
}