Java 如何将单元测试上传目录写入S3?

Java 如何将单元测试上传目录写入S3?,java,unit-testing,amazon-s3,junit,spring-cloud,Java,Unit Testing,Amazon S3,Junit,Spring Cloud,我有一个方法将目录上传到s3。 我想为它编写一个单元测试,我一直在搜索,但大多数测试都是集成测试。 也许我不应该对这种过程进行单元测试? 我没有使用testcontainers进行集成测试的特权,所以我不能使用testcontainers 这是我的密码 public void uploadDir(final Path path, final String key) throws InternalServerError { final TransferManager transfe

我有一个方法将目录上传到s3。 我想为它编写一个单元测试,我一直在搜索,但大多数测试都是集成测试。 也许我不应该对这种过程进行单元测试? 我没有使用testcontainers进行集成测试的特权,所以我不能使用testcontainers

这是我的密码

public void uploadDir(final Path path, final String key) throws InternalServerError {
        final TransferManager transferManager = TransferManagerBuilder.standard()
                                                                      .withS3Client(s3Client)
                                                                      .build();
       

            final ProgressListener progressListener = progressEvent -> {
                if (progressEvent.getBytesTransferred() > 0) {
                    double percentTransferred = progressEvent.getBytesTransferred() * 100.0 / progressEvent.getBytes();
                    log.info("Transferred " + percentTransferred + "%");
                }
            };

            final MultipleFileUpload xfer = transferManager.uploadDirectory("mybucket", key, path.toFile(), true);
            xfer.addProgressListener(progressListener);
            xfer.waitForCompletion();
            
           log.info("Upload has been completed.");
        } catch (final AmazonServiceException | InterruptedException exception) {
            
            ... do something here
        } finally {
            transferManager.shutdownNow();
        }
    } 

方法中似乎没有太多的单元测试,只有参数和交互。
模拟
TransferManager
并不是真正的解决方案,因为您需要模拟
MultipleFileUpload
,并且还需要添加调用
ProgressListener
的代码。你最终会嘲笑一切使它无用的东西。测试广泛使用的库对您也没有多大价值

在集成测试期间,我会测试不太可能发生的异常情况(也称为不可重复)。
大致如下(假设mockito):

@测试
void uploadDirFailsTest(){
TransferManager mockTM=mock(TransferManager.class);
doThrow(新的AmazonServiceException(…)//希望它有一个公共构造函数
.何时(mockTM)
.uploadDirectory(eq(“mybucket”)、any()、any()、eq(true));//如果需要,可以进行更多匹配
YourClassName实例=新建YourClassName(mockTM);
uploadDir(路径,键);
/*
在此处或此处验证异常处理是否正确
如果重新引发异常,请使用
资产负债表()
*/
}
public类YourClassName{
最终转让经理转让经理;
public YourClassName(TransferManager TransferManager){
this.transferManager=transferManager;
}
public void uploadDir(最终路径,最终字符串键)引发InternalServerError{
最终ProgressListener ProgressListener=progressEvent->{
如果(progressEvent.GetByTestTransferred()>0){
double PercentTransfer=progressEvent.GetByTestTransferred()*100.0/progressEvent.getBytes();
日志信息(“已转移”+已转移百分比+“%”);
}
};
final MultipleFileUpload xfer=transferManager.uploadDirectory(“mybucket”,key,path.toFile(),true);
xfer.addProgressListener(progressListener);
xfer.waitForCompletion();
log.info(“上传已完成”);
}捕获(最终AmazonServiceException | InterruptedException异常){
…在这里做点什么
}最后{
transferManager.shutdownNow();
}
} 
//实际使用
新的你的类名(
TransferManagerBuilder.standard()
.与3个客户端(S3客户端)
.build()
);

方法中似乎没有太多的单元测试,只有参数和交互。
模拟
TransferManager
并不是真正的解决方案,因为您需要模拟
MultipleFileUpload
,并且还需要添加调用
ProgressListener
的代码。你最终会嘲笑一切使它无用的东西。测试广泛使用的库对您也没有多大价值

在集成测试期间,我会测试不太可能发生的异常情况(也称为不可重复)。
大致如下(假设mockito):

@测试
void uploadDirFailsTest(){
TransferManager mockTM=mock(TransferManager.class);
doThrow(新的AmazonServiceException(…)//希望它有一个公共构造函数
.何时(mockTM)
.uploadDirectory(eq(“mybucket”)、any()、any()、eq(true));//如果需要,可以进行更多匹配
YourClassName实例=新建YourClassName(mockTM);
uploadDir(路径,键);
/*
在此处或此处验证异常处理是否正确
如果重新引发异常,请使用
资产负债表()
*/
}
public类YourClassName{
最终转让经理转让经理;
public YourClassName(TransferManager TransferManager){
this.transferManager=transferManager;
}
public void uploadDir(最终路径,最终字符串键)引发InternalServerError{
最终ProgressListener ProgressListener=progressEvent->{
如果(progressEvent.GetByTestTransferred()>0){
double PercentTransfer=progressEvent.GetByTestTransferred()*100.0/progressEvent.getBytes();
日志信息(“已转移”+已转移百分比+“%”);
}
};
final MultipleFileUpload xfer=transferManager.uploadDirectory(“mybucket”,key,path.toFile(),true);
xfer.addProgressListener(progressListener);
xfer.waitForCompletion();
log.info(“上传已完成”);
}捕获(最终AmazonServiceException | InterruptedException异常){
…在这里做点什么
}最后{
transferManager.shutdownNow();
}
} 
//实际使用
新的你的类名(
TransferManagerBuilder.standard()
.与3个客户端(S3客户端)
.build()
);

Mock transfer manager并将其传入或放在类Mock transfer manager的字段中,然后传入或放在类的字段中