如何在集成测试中模拟 Amazon S3
2022-09-01 03:07:12
我正在尝试为我的应用程序获取一个“行走的骨架”,它将使用S3进行持久性。我想使用假的S3服务,以便每个开发人员的桌面可以随意读/写。
我认为 mocks3 会很完美,因为我可以在 jUnit 测试中启动一个码头服务器。问题是 mocks3 不允许任何写入。据我所知,甚至没有设置它。
那么其他人是怎么做到的呢?
我正在尝试为我的应用程序获取一个“行走的骨架”,它将使用S3进行持久性。我想使用假的S3服务,以便每个开发人员的桌面可以随意读/写。
我认为 mocks3 会很完美,因为我可以在 jUnit 测试中启动一个码头服务器。问题是 mocks3 不允许任何写入。据我所知,甚至没有设置它。
那么其他人是怎么做到的呢?
还有一个正是为此目的编写的Findify s3mock工具。它在本地文件系统之上模拟了 AWS S3 API 的基本部分:
import io.findify.s3mock.S3Mock
S3Mock api = S3Mock.create(8001, "/tmp/s3");
api.start();
AmazonS3Client client = new AmazonS3Client(new AnonymousAWSCredentials());
// use local API mock, not the AWS one
client.setEndpoint("http://127.0.0.1:8001");
client.createBucket("testbucket");
client.putObject("testbucket", "file/name", "contents");
它还易于嵌入且无需配置。
如果你可以依赖于正在运行的 docker 容器,并且想要一些得到良好支持的东西,你可以考虑使用 localstack
在运行测试之前,请按如下方式启动 S3:
docker run --name localstack -d -p 5000:5000 -e SERVICES=s3:5000 localstack/localstack
然后在测试完成后停止它,如下所示:
docker stop localstack
您需要将 S3 客户端配置为指向 localhost:5000 进行测试。在Java中,这可以像这样完成:
AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
"http://localhost:5000",
"us-west-2"))
.build();