Я создаю интеграционные тесты для своих микросервисов, используя Citrus Framework. Сервисы основаны на Spring Boot и взаимодействуют через вызовы REST по HTTP.
На данный момент я успешно построил и протестировал два теста для двух микросервисов. Теперь я пытаюсь написать еще один тест, который тестирует третий микросервис, и столкнулся с проблемой, которую не знаю, как решить. У меня все три теста содержатся в одном классе тестов, поскольку все они связаны.
Когда я запускаю тест, я получаю сообщение об ошибке от Citrus, которое указывает на то, что служба, которую я пытаюсь протестировать, «недоступна» ".
10:28:39.946 [main] DEBUG com.consol.citrus.http.interceptor.LoggingClientInterceptor - Received Http response message
10:28:39.946 [main] DEBUG Logger.Message_IN - HTTP/1.1 503 SERVICE_UNAVAILABLE Service Unavailable
Date:Tue, 04 Feb 2020 15:28:34 GMT
X-Content-Type-Options:nosniff,nosniff
X-XSS-Protection:1; mode=block
Pragma:no-cache
X-Frame-Options:DENY
Content-Type:application/json;charset=utf-8
Transfer-Encoding:chunked
{"timestamp":"2020-02-04T15:28:39.922+0000","status":503,"error":"Service Unavailable","message":"Service Unavailable","path":"/v1/missionServices/missionPlanning/planMission"}
10:28:39.946 [main] DEBUG org.springframework.web.client.RestTemplate - Response 503 SERVICE_UNAVAILABLE
10:28:39.951 [main] INFO com.consol.citrus.http.client.HttpClient - Caught HTTP rest client exception: 503 Service Unavailable
Я почти уверен, что у меня все" подключено "правильно, и когда вызов REST сделан" нормально ", он работает как надо.
Есть что-то отметить, что может или не может быть причиной проблемы. Вызов службы REST, который не проходит тест, не принимает никакой полезной нагрузки сообщения. Реализация кода Java для конечной точки REST не требует объекта.
@PostMapping(value = "/planMission", produces = MediaType.APPLICATION_JSON_VALUE)
public DeferredResult<ResponseEntity<GeneralResponse>> planMission() {
DeferredResult<ResponseEntity<GeneralResponse>> result = new DeferredResult<>(timeout);
executor.execute(new Runner(result));
return result;
}
Код клиента теряет значение NULL при выполнении вызова REST.
GeneralResponse response = restTemplate.postForObject(url, null, GeneralResponse.class);
Примечание : Я обновил этот вызов следующим образом:
GeneralResponse response = restTemplate.postForObject(url, HttpEntity.EMPTY, GeneralResponse.class);
Может ли это быть как-то связано с моей проблемой?
Тестовый код:
@Test
@CitrusTest
public void testPlanMission(@CitrusResource TestRunner runner) {
runner.http(builder -> builder
.client(missionPlannerHTTPClient)
.send()
.post("/v1/missionServices/missionPlanning/planMission"));
runner.http(builder -> builder
.client(missionPlannerHTTPClient)
.receive()
.response(HttpStatus.OK)
.messageType(MessageType.JSON)
.payload(new ClassPathResource("templates/plan-mission-response.json")));
}
ОБНОВЛЕНИЕ (2/4/2020):
Странное (и неожиданное) поведение. Я провел несколько тестов / экспериментов, где использовал Postman для отправки HTTP-запроса POST на работающие микросервисы. Я получаю тот же ответ (503 - Служба недоступна), но на самом деле странным является , когда вывод консоли из служб показывает, что последовательность команд была получена и действовала . Это будет означать, что запрос был успешно отправлен и получен. Последующее тестирование с интеграционным тестом Citrus показывает точно такое же поведение.
Что здесь происходит? Опять же, когда службы запускаются "нормально" с клиентской службой, которая выполняет первоначальный вызов POST, все работает как надо.
UPDATE (2/5/2020):
Я даже пытался провести эксперимент, в котором теперь отправляю сообщение с запросом при выполнении вызова POST. Сообщение не имеет никакой полезной цели. Это не имело никакого значения ни для теста Почтальона, ни для цитрусовых.