Введение: В настоящее время я пишу интеграционные тесты для моего API-шлюза с Zuul Proxy с использованием SpringBootTest. Я уже создал работающий макетный микросервис на порту 8089
, возвращающий некоторые json данные, на которые приложение шлюза должно пересылать входящие запросы.
Проблема: Zuul удается сопоставить маршрутизирует правильно, однако он не может каким-либо образом перенаправить запрос, потому что ответ всегда является пустым HTTP 200, тогда как он должен содержать данные json, возвращаемые проверенным микросервисом. Эта проблема возникает только в тесте. Он отлично работает в производстве.
Недавние наблюдения: Во время отладки я выяснил, что в тесте FilterLoader
не предоставляет никаких фильтров типа route
, в то время как в производстве он предоставляет список из трех фильтры, которые затем используются методом route()
из ZuulServlet
. После обработки метода route()
ответ заполняется данными, полученными из микросервиса. В тесте этого не происходит.
Я также пытался заменить фиктивный сервер реальным - результат был точно таким же.
Вопрос: Я бы хотел Спасибо за любые советы по этой проблеме;)
Zuul Config:
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();
}