Amazon Kinesis + Интеграционные тесты
В настоящее время я работаю над серией веб-сервисов, которые нам нужно интегрировать с Kinesis - реализация была выполнена, однако у нас есть ряд интеграционных тестов (все наши веб-сервисы используют Spring Boot, поэтому мы используем @WebIntegrationTest
аннотации к нашим тестовым классам для запуска локального экземпляра сервера, а затем для вызова наших ресурсов с TestRestTemplate
), которые в настоящее время пытаются и не могут подключиться к реальному Kinesis.
Несмотря на то, что в обычных модульных тестах не является проблемой макетирование вызовов методов в библиотеке Kinesis, мы не можем сделать это в интеграционных тестах, поскольку весь стек приложений связан с Spring. Для некоторых других вещей (таких как OAuth2 и звонки в другие наши веб-сервисы) мы смогли использовать WireMock для макетирования реальных конечных точек - что я действительно хотел бы сделать, так это использовать WireMock таким образом, чтобы макетировать звонок в AmazonKinesisClient
, но я не могу найти совет, как это сделать.
В качестве альтернативы я видел, что некоторые компоненты AWS имеют тестовые библиотеки, написанные сторонними разработчиками, которые позволяют запускать их локальную версию (например, DynamoDbLocal), но не могут найти такое решение для Kinesis.
Кто-нибудь может дать мне несколько советов о том, как запускать интеграционные тесты с Kinesis?
Ответы
Ответ 1
Я столкнулся с той же проблемой, и единственная версия mock, которую я нашел до сих пор, была nodejs one: https://github.com/mhart/kinesalite
Это трюк - мне удалось запустить клиент Java Kinesis против него, просто нужно было установить конечную точку на странице kinesis.properties:
kinesisEndpoint=http://localhost:4567
Недостатком является то, что использовать его во время тестов времени сборки нетривиально - нужно придумать способ начать фиктивный кинезис перед тестированием (используя плагин maven или что-то еще), еще не добрался до него.
Ответ 2
Возможно, уже слишком поздно предлагать решение, но я добавлю, что моя команда сделала для локальной репликации ресурсов AWS, так как мы используем много Kinesis, DynamoDb, S3 и cloudWatch.
Мы создали оболочки вокруг Localstack → https://github.com/localstack/localstack, которые позволяют нам раскручивать локальные экземпляры необходимых сервисов в качестве док-контейнеров, используя docker-compose
.
Типичный файл docker-compose.yml
для нас выглядит следующим образом:
version: '2'
services:
localstack:
image: "localstack/localstack"
environment:
- SERVICES=kinesis,dynamodb,cloudwatch
ports:
- "4568"
- "4569"
- "4582"
Затем на этапе настройки для интеграционных тестов наша оболочка запускается docker-compose up
и запускает тесты для локальной инфраструктуры.
Позже во время демонтажа упаковщик убивает контейнеры.
Ответ 3
Просто небольшое дополнение к существующим ответам. Кстати, они великолепны, вам действительно нужно использовать такие инструменты, как localstack, чтобы запускать поддельные сервисы AWS перед тестированием на этапе тестирования.
Если вы используете JUnit 5 в своих тестах, ваша жизнь может быть еще проще с расширениями JUnit 5 для AWS, несколькими расширениями JUnit 5, которые могут быть полезны для тестирования кода, связанного с AWS. Эти расширения могут использоваться для внедрения клиентов в макеты службы AWS, предоставляемые такими инструментами, как localstack. Поддерживаются как AWS Java SDK v 2.x, так и v 1.x:
@ExtendWith(DynamoDB.class)
class AmazonDynamoDBInjectionTest {
@AWSClient(
endpoint = Endpoint.class
)
private AmazonDynamoDB client;
@Test
void test() throws Exception {
Assertions.assertNotNull(client);
Assertions.assertEquals(
Collections.singletonList("table"),
client.listTables().getTableNames().stream().sorted().collect(Collectors.toList())
);
}
}
Здесь клиент будет просто введен в ваш тестовый класс и настроен в соответствии с классом конфигурации Endpoint
.