我目前正在开发一系列需要与Kinesis集成的Web服务 - 实现已经完成,但我们有一系列集成测试(我们的Web服务都使用Spring Boot,所以我们使用我们的测试类上的@WebIntegrationTest注释用于启动服务器的本地实例,然后使用TestRestTemplate调用我们的资源,这些资源当前正在尝试并且无法连接到真正的Kinesis。
虽然在普通的单元测试中,模拟对Kinesis库中方法的调用并不是一个问题,但是我们无法在集成测试中真正做到这一点,因为整个应用程序堆栈都与Spring连接。对于其他一些事情(例如OAuth2和对其他Web服务的调用),我们已经能够使用WireMock来模拟实际的端点 - 我真正想做的是以这种方式使用WireMock来模拟对AmazonKinesisClient的调用,但我找不到任何关于如何执行此操作的建议。
或者我已经看到一些AWS组件具有由第三方编写的测试库,允许您运行它的本地版本(例如:DynamoDbLocal)但是找不到Kinesis的这样的解决方案。
有人能就如何与Kinesis运行集成测试给我一些建议吗?
答案 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
配置类进行配置。