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

问题描述 投票:0回答:9

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

我认为 mocks3 会很完美,因为我可以在 jUnit 测试中安装一个 jetty 服务器。问题是mocks3不允许任何writes。据我所知,甚至没有设置它。

那么其他人是如何做到这一点的呢?

java junit amazon-s3 integration-testing
9个回答
44
投票

还有一个专门为此目的编写的 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");

它还可以轻松嵌入且无需配置。


16
投票

如果您同意依赖正在运行的 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();

10
投票

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


10
投票

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


7
投票

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

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

开箱即可使用。


1
投票

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


0
投票

LocalS3是一个不错的选择。

  • 它基于 Netty,没有大量其他依赖项。启动 LocalS3 服务或 Docker 容器 非常快。

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

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


0
投票

(这里是维护者)

还有(Gofake)S3

此工具可用于运行测试服务器,例如,支持测试与 S3 交互的 AWS Lambda 函数。它还可以作为简单便捷的 S3 模拟和测试服务器,满足各种开发需求。


-2
投票

一种选择是废弃 jetty 服务器并使用 Apache VFSS3 插件。这样,您就可以使用内存或基于文件的存储实现来进行集成测试。

© www.soinside.com 2019 - 2024. All rights reserved.