Java 如何将单元测试上传目录写入S3?
我有一个方法将目录上传到s3。 我想为它编写一个单元测试,我一直在搜索,但大多数测试都是集成测试。 也许我不应该对这种过程进行单元测试? 我没有使用testcontainers进行集成测试的特权,所以我不能使用testcontainers 这是我的密码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
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的字段中,然后传入或放在类的字段中