Gav*_*avi 9 java junit mockito aws-sdk
我正在使用 Java,并使用 AWS SDK 与 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();
}
Run Code Online (Sandbox Code Playgroud)
为此,我使用 JUnit 5 和 Mockito。问题是我不知道如何模拟结果
s3Client.getObject(getObjectRequest)
Run Code Online (Sandbox Code Playgroud)
因为返回类型
ResponseInputStream<GetObjectResponse>
Run Code Online (Sandbox Code Playgroud)
是最后一堂课。
有什么想法或建议吗?谢谢
小智 8
如果有人仍在寻找不同的解决方案,这就是我的做法:
这是需要模拟的代码:
InputStream objectStream =
this.s3Client.getObject(
GetObjectRequest.builder().bucket(bucket).key(key).build(),
ResponseTransformer.toInputStream());
Run Code Online (Sandbox Code Playgroud)
这是模拟它的方法:
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));
});
Run Code Online (Sandbox Code Playgroud)
问题已经解决了。在 Maven 项目中,您可以在文件夹“src/test/resources/mockito-extensions”中添加一个名为“org.mockito.plugins.MockMaker”的文件。
在文件内,添加不带引号的“mock-maker-inline”。
从现在开始,Mockito 也将能够模拟期末课程。
| 归档时间: |
|
| 查看次数: |
22314 次 |
| 最近记录: |