Amazon Kinesis + 集成测试

Amazon Kinesis + Integration Tests

我目前正在开发一系列我们需要与 Kinesis 集成的网络服务 - 实施已经完成,但是我们有一系列集成测试(我们的网络服务都使用 Spring Boot 所以我们在测试 类 上使用 @WebIntegrationTest 注释来启动服务器的本地实例,然后使用 TestRestTemplate) 调用我们的资源,这些资源目前正在尝试但失败了连接到真正的 Kinesis。

虽然在普通的单元测试中模拟调用 Kinesis 库中的方法不是问题,但我们不能在集成测试中真正做到这一点,因为整个应用程序堆栈都与 Spring.对于其他一些事情(例如 OAuth2 和对我们其他网络服务的调用),我们已经能够使用 WireMock 来模拟实际的端点——我真正想做的是以这种方式使用 WireMock 来模拟调用 AmazonKinesisClient 但我找不到任何关于如何执行此操作的建议。

或者,我看到一些 AWS 组件具有第三方编写的测试库,允许您 运行 它的本地版本(例如:DynamoDbLocal),但找不到适用于 Kinesis 的此类解决方案。

有人能给我一些关于如何 运行 与 Kinesis 集成测试的建议吗?

我 运行 遇到了同样的问题,到目前为止我发现的唯一模拟实现是一个 nodejs 实现:https://github.com/mhart/kinesalite 它成功了——我设法 运行 我的 Java Kinesis 客户端反对它,只需要在 kinesis.properties:

上设置端点
kinesisEndpoint=http://localhost:4567

缺点是在构建时测试期间使用它不是微不足道的——需要想办法在测试前启动模拟运动(使用 maven 插件或其他东西),还没有做到..

现在提供解决方案可能已经太晚了,但我将添加我的团队在本地复制 AWS 资源所做的工作,因为我们使用了很多 Kinesis、DynamoDb、S3 和 cloudWatch。

我们围绕 Localstack 创建了包装器 -> https://github.com/localstack/localstack 允许我们使用 docker-compose.

将必要服务的本地实例作为 docker 容器启动

我们的典型 docker-compose.yml 文件如下所示:

version: '2'
services:
  localstack:
    image: "localstack/localstack"
    environment:
      - SERVICES=kinesis,dynamodb,cloudwatch
    ports:
      - "4568"
      - "4569"
      - "4582"

然后在集成测试的设置阶段,我们的包装器启动 docker-compose up 并针对本地基础设施运行测试。 后来在拆卸过程中,包装器杀死了容器。

只是对现有答案的一小部分补充。顺便说一句,它们很棒,你真的应该在测试阶段使用 localstack 这样的工具在测试之前启动假的 AWS 服务。

如果您在测试中使用 JUnit 5,那么使用 JUnit 5 extensions for AWS 一些 JUnit 5 扩展可能对测试 AWS 相关代码很有用,您的生活会变得更加简单。这些扩展可用于为 localstack 等工具提供的 AWS 服务模拟注入客户端。支持 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())
        );
    }
}

在这里,客户端将被注入到您的测试中 class 并根据 Endpoint 配置 class.