14

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

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

或者,我看到一些 AWS 组件具有由第三方编写的测试库,允许您运行它的本地版本(例如:DynamoDbLocal),但无法为 Kinesis 找到这样的解决方案。

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

4

3 回答 3

11

给出解决方案可能已经太晚了,但我将添加我的团队在本地复制 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并针对本地基础设施运行测试。稍后在拆卸过程中,包装器会杀死容器。

于 2018-01-29T11:48:19.690 回答
1

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

kinesisEndpoint=http://localhost:4567

缺点是在构建时测试期间使用它并非易事 - 需要在测试之前找到一种方法来启动模拟 kinesis(使用 maven 插件或其他东西),还没有得到它..

于 2015-09-30T12:07:11.893 回答
0

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

如果您在测试中使用 JUnit 5,那么使用适用于 AWS 的 JUnit 5 扩展,您的生活可能会更加简单一些 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())
        );
    }
}

在这里,客户端将被注入您的测试类并根据Endpoint配置类进行配置。

于 2019-09-26T09:48:32.143 回答