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

Mic*_*uff 18 java junit integration-testing amazon-s3

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

我认为mocks3会很完美,因为我可以在我的jUnit测试中得到一个码头服务器.问题是mocks3不允许任何写入.据我所知,甚至没有设置它.

那么别人怎么做呢?

shu*_*tty 16

还有一个完全为此目的而编写的s3mock工具.它在本地文件系统之上模仿AWS S3 API的基本部分:

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");
Run Code Online (Sandbox Code Playgroud)

它也易于嵌入和配置.


Jay*_* P. 8

另一个选择是S3忍者 - 模拟S3 API用于开发和测试目的.


小智 6

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


Sti*_*imp 6

如果可以根据正在运行的Docker容器确定并希望得到良好的支持,则可以考虑使用localstack

在运行测试之前,请像这样启动S3:

docker run --name localstack -d -p 5000:5000 -e SERVICES=s3:5000 localstack/localstack
Run Code Online (Sandbox Code Playgroud)

然后在测试完成时将其停止,如下所示:

docker stop localstack
Run Code Online (Sandbox Code Playgroud)

您需要将S3客户端配置为指向localhost:5000进行测试。在Java中,可以这样进行:

        AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                 "http://localhost:5000", 
                 "us-west-2"))
            .build();
Run Code Online (Sandbox Code Playgroud)


mik*_*pie 5

Tornado,一个python Web框架,有一个您所需要的示例应用程序。

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

它可以直接使用。