首页 > 解决方案 > 如何使用 Java 对 AWS S3 开发工具包的 getObject 方法进行单元测试?

问题描述

我正在使用 Java,并且正在使用 AWS 开发工具包与 S3 进行交互。我有以下方法,我想对其进行单元测试

private final S3Client s3Client;
...
...
public byte[] download(String key) throws IOException {
    GetObjectRequest getObjectRequest = GetObjectRequest.builder()
            .bucket("myBucket")
            .key(key)
            .build();
    return s3Client.getObject(getObjectRequest).readAllBytes();
}

为此,我使用 JUnit 5 和 Mockito。问题是我不知道如何模拟结果

s3Client.getObject(getObjectRequest) 

因为返回类型

ResponseInputStream<GetObjectResponse> 

是最后一堂课。

有什么想法或建议吗?谢谢

标签: javajunitmockitoaws-sdk

解决方案


如果有人仍在寻找不同的解决方案,我就是这样做的:
这是需要模拟的代码:

InputStream objectStream =
    this.s3Client.getObject(
        GetObjectRequest.builder().bucket(bucket).key(key).build(),
        ResponseTransformer.toInputStream());

这是如何模拟它:

S3Client s3Client = Mockito.mock(S3Client.class);
String bucket = "bucket";
String key = "key";
InputStream objectStream = getFakeInputStream();
when(s3Client.getObject(
        Mockito.any(GetObjectRequest.class),
        ArgumentMatchers
            .<ResponseTransformer<GetObjectResponse, ResponseInputStream<GetObjectResponse>>>
                any()))
    .then(
        invocation -> {
          GetObjectRequest getObjectRequest = invocation.getArgument(0);
          assertEquals(bucket, getObjectRequest.bucket());
          assertEquals(key, getObjectRequest.key());

          return new ResponseInputStream<>(
              GetObjectResponse.builder().build(), AbortableInputStream.create(objectStream));
        });

推荐阅读