如何在集成测试中模拟Amazon S3



我试图得到我的应用程序的"行走骨架",将使用S3持久化。我想使用一个假的S3服务,这样每个开发人员的桌面都可以随意读写。

我认为mocks3将是完美的,因为我可以在我的jUnit测试中得到一个jetty服务器。问题是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();

另一个选择是S3 ninja——模拟S3 API用于开发和测试目的。

看看Adobe的S3Mock。这个S3 Mock服务器可以通过Docker容器或JUnit 4/5规则启动。

Tornado,一个python web框架,有一个示例应用程序,正是你正在寻找的。

https://github.com/facebook/tornado/blob/master/demos/s3server/s3server.py

可以开箱即用

你可以使用scalitys3server,它可以在你的机器上运行,使用node.js或通过docker,它给你一个本地S3服务实例。它是在BSD许可下开源的github.com/scality/s3

LocalS3是个不错的选择。

  • 它是基于Netty和没有沉重的其他依赖。启动LocalS3服务或Docker容器非常快。

  • 支持常用的AmazonS3 api。包括版本化对象、多部分上传等

  • 支持内存和持久化模式。

一种选择是放弃jetty服务器,使用Apache VFS和S3插件。这样,您就可以为集成测试使用内存或基于文件的存储实现。

最新更新