You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在S3MockContainer中创建存储桶、文件夹并上传文件?

操作步骤

1. 添加AWS SDK依赖

确保项目中引入AWS S3 SDK,以Maven为例:

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.20.0</version>
    <scope>test</scope>
</dependency>

2. 配置S3Client连接S3Mock容器

在测试类中创建连接到S3Mock的客户端实例:

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import java.net.URI;

// 测试类内添加
private S3Client s3Client;

@BeforeEach
void setUp() {
    s3Client = S3Client.builder()
            .endpointOverride(URI.create(s3MockContainer.getHttpEndpoint()))
            .credentialsProvider(StaticCredentialsProvider.create(
                    AwsBasicCredentials.create("accessKey", "secretKey")
            ))
            .region(Region.US_EAST_1)
            .build();
}

3. 创建模拟文件夹

S3没有真实的文件夹概念,通过带/后缀的对象键模拟文件夹:

@Test
void createFolder() {
    String folderKey = "test-folder/";
    // 上传空对象模拟文件夹
    s3Client.putObject(req -> req.bucket(BUCKET_NAME).key(folderKey),
            software.amazon.awssdk.core.sync.RequestBody.empty());
}

4. 上传文件到指定路径

可以上传本地测试文件到目标路径(包括模拟文件夹下):

import java.nio.file.Paths;

@Test
void uploadFileToFolder() {
    // 本地测试文件路径
    var testFile = Paths.get("src/test/resources/test-file.txt").toFile();
    // 目标路径:test-folder下的test-file.txt
    String targetKey = "test-folder/test-file.txt";

    s3Client.putObject(req -> req.bucket(BUCKET_NAME).key(targetKey), testFile);

    // 验证文件是否存在
    boolean exists = s3Client.listObjectsV2(req -> req.bucket(BUCKET_NAME).prefix(targetKey))
            .contents().stream()
            .anyMatch(obj -> obj.key().equals(targetKey));
    assert exists;
}

完整测试类示例

整合所有步骤到原有代码:

import com.adobe.testing.s3mock.testcontainers.S3MockContainer;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.DockerImageName;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.springframework.boot.test.context.SpringBootTest;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import java.net.URI;
import java.nio.file.Paths;

@Testcontainers
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestContainerSetUp {

    protected static final String BUCKET_NAME = "testbucket";

    @Container
    public static final S3MockContainer s3MockContainer = new S3MockContainer(DockerImageName.parse("adobe/s3mock:2.4.13"))
            .withInitialBuckets(BUCKET_NAME);

    private S3Client s3Client;

    @BeforeEach
    void setUp() {
        s3Client = S3Client.builder()
                .endpointOverride(URI.create(s3MockContainer.getHttpEndpoint()))
                .credentialsProvider(StaticCredentialsProvider.create(
                        AwsBasicCredentials.create("accessKey", "secretKey")
                ))
                .region(Region.US_EAST_1)
                .build();
    }

    @Test
    void setupS3Resources() {
        // 创建模拟文件夹
        String folderKey = "test-folder/";
        s3Client.putObject(req -> req.bucket(BUCKET_NAME).key(folderKey),
                software.amazon.awssdk.core.sync.RequestBody.empty());

        // 上传测试文件到文件夹
        var testFile = Paths.get("src/test/resources/test-file.txt").toFile();
        String fileKey = "test-folder/test-file.txt";
        s3Client.putObject(req -> req.bucket(BUCKET_NAME).key(fileKey), testFile);

        // 验证资源存在
        var folderExists = s3Client.listObjectsV2(req -> req.bucket(BUCKET_NAME).prefix(folderKey))
                .contents().stream().anyMatch(obj -> obj.key().equals(folderKey));
        var fileExists = s3Client.listObjectsV2(req -> req.bucket(BUCKET_NAME).prefix(fileKey))
                .contents().stream().anyMatch(obj -> obj.key().equals(fileKey));

        assert folderExists && fileExists;
    }
}

注意事项

  • S3Mock的凭证可随意填写,无需真实AWS账号信息
  • 若不需要预先创建桶,可调用s3Client.createBucket(req -> req.bucket("new-bucket"))手动创建
  • 测试结束后,Testcontainers会自动销毁S3Mock容器,无需手动清理

内容的提问来源于stack exchange,提问作者user1555190

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:40:27