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.