Amazon Kinesis +集成测试

时间:2015-06-11 09:52:48

标签: java spring spring-boot integration-testing amazon-kinesis

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

kinesisEndpoint=http://localhost:4567

缺点是在构建时测试中使用它并不容易 - 需要想方设法在测试之前启动模拟运动(使用maven插件或其他东西),还没到达它..

答案 2 :(得分:0)

仅是现有答案的一小部分。顺便说一句,它们很棒,您应该在测试阶段真正使用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())
        );
    }
}

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