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

时间:2011-07-07 19:28:33

标签: java junit amazon-s3 integration-testing

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

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

其他人如何做到这一点?

7 个答案:

答案 0 :(得分: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");

它也很容易嵌入和配置。

答案 1 :(得分:8)

另一个选项是S3 ninja - 模拟S3 API以进行开发和测试。

答案 2 :(得分:5)

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

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

它可以直接使用。

答案 3 :(得分:3)

如果您可以根据正在运行的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();

答案 4 :(得分:2)

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

答案 5 :(得分:0)

您可以使用scality s3server,可以使用node.js或docker在您的计算机上运行,​​它可以为您提供本地S3服务实例。它是BSD许可下的开源软件 github.com/scality/s3

答案 6 :(得分:-1)

一种方法是废弃码头服务器并使用Apache VFSS3 plugin。有了它,您可以使用内存或基于文件的存储实现进行集成测试。