【问题标题】:How to mock Amazon S3 in an integration test如何在集成测试中模拟 Amazon S3
【发布时间】:2011-09-30 18:05:47
【问题描述】:

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

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

那么其他人是怎么做到的呢?

【问题讨论】:

  • 如果有人有Ruby等其他语言的答案,请评论!

标签: java junit amazon-s3 integration-testing


【解决方案1】:

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

它还易于嵌入且无需配置。

【讨论】:

  • 一个问题,如果你使用 kms 加密,基本上putObjectRequest.setSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams()); aws sdk 会抛出错误,说使用 SSE 需要 https,因此代码中必须有 if else
  • @bestwish 想知道是否有办法解决此问题而无需在代码中添加 if else/如果他们从那时起对其进行了更新?
  • @Steve 我想我有一个 if else,但后来我们转移到桶级加密(我不知道确切的名称),我们不必手动设置 SSEAwsKeyManagementParams()。但我们无法绕过这个限制。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        它可以开箱即用。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            一种选择是废弃码头服务器并使用Apache VFS 和S3 plugin。这样,您就可以使用内存或基于文件的存储实现进行集成测试。

            【讨论】:

            • 我相信这个插件充当客户端,而不是服务器,因此无法用它实现这个用例。
            猜你喜欢
            • 2021-09-29
            • 2019-12-07
            • 1970-01-01
            • 2012-04-25
            • 1970-01-01
            • 2021-07-05
            • 2018-09-07
            • 2012-08-15
            • 1970-01-01
            相关资源
            最近更新 更多