如何在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
相关产品推荐
相关产品推荐

