Java 微文件容错单元测试

Java 微文件容错单元测试,java,quarkus,fault-tolerance,microprofile,Java,Quarkus,Fault Tolerance,Microprofile,我正在使用带有微文件容错功能的Qurkus在JDBC连接()上实现容错功能 我已经实现了类似的功能: 类存储库{ 私有最终数据源DataSource;//在构造函数上初始化 集合getData()异常SQLException{ try(var conn=dataSource.getConnection(); var stmt=conn.createStatement(); var rs=stmt.executeQuery(sql)){ var result=new ArrayList(); wh

我正在使用带有
微文件容错功能的Qurkus在JDBC连接()上实现容错功能

我已经实现了类似的功能:

类存储库{
私有最终数据源DataSource;//在构造函数上初始化
集合getData()异常SQLException{
try(var conn=dataSource.getConnection();
var stmt=conn.createStatement();
var rs=stmt.executeQuery(sql)){
var result=new ArrayList();
while(rs.next()){
添加(rs.getString(“数据”));
}
返回结果;
}捕获(SQLE异常){
//记录并引发自定义异常
}
}
}
班级服务{
@注入
仓库回购;
公共收集呼叫服务(){
//其他不需要重试的代码
试一试{
var res=getData();
}捕获(例外e){
//日志异常
抛出新的CustomException(e);
}
返回res;
}
@重试()
私有集合getData()引发异常{
返回repo.getData();
}
}
现在,我尝试使用单元测试测试重试。我没有找到任何与
微文件容错相关的文档


@夸克斯特
类服务测试{
@注入
服务;
@注射模拟
储存库;
@试验
void shouldHandleRetryWhenErrorOccursDuringQueryData()引发异常{
ArrayList expectedResult=Lists.newArrayList(“1”、“2”);
何时(repository.getData())
.thenThrow(新运行时异常(“运行时异常”))
.然后返回(预期结果);
集合executionResult=service.callService();
AsserteTableEquals(expectedResult、executionResult);
}
}
我的期望是数据在重试一次后返回(对
getData
的第一次调用返回错误)。相反,只返回错误


测试我的方法重试的正确方法是什么?

不幸的是,mock不能与容错注释一起使用,因为Mockito有效地覆盖了原始方法的所有内容,包括
@Retry
注释。您可以通过将
@Retry
注释移动到您不模拟的对象上(
Service.callService()
方法)来修复此问题,这样将重试
callService
方法,并且在第二次尝试时,对存储库的调用将通过。

不幸的是,Mocks不能与容错注释一起使用,因为Mockito有效地覆盖了原始方法的所有内容,包括
@Retry
注释。您可以通过将
@Retry
注释移动到您不模拟的对象上(
Service.callService()
方法)来修复此问题,这样
callService
方法将被重试,第二次尝试时,对存储库的调用将通过。

您的解决方案听起来不错,但是在服务函数中,我有其他不应该在重试时重新执行的代码。嗯,在这种情况下,我认为您需要在存储库周围再添加一个中间包装器,并且将对其应用
@Retry
注释。但是还有一个问题,这是否是一个好主意,您正在测试Quarkus中内置的重试功能,而不是测试您自己的业务代码。这是Quarkus测试套件中涵盖的内容。因此,您的测试只有在您确实不相信Quarkus团队测试正确的情况下才有意义;)我正在验证我的逻辑是否返回错误或数据,即使重试也是如此。我不测试重试逻辑。您的解决方案听起来不错,但在服务函数中,我有其他代码不应在重试时重新执行。嗯,在这种情况下,我认为您需要在存储库周围再添加一个中间包装器,而
@Retry
注释将应用于此..但还有一个问题,这到底是不是一个好主意,您正在测试Quarkus中内置的重试功能,而不是测试您自己的业务代码。这是Quarkus测试套件中涵盖的内容。因此,您的测试只有在您确实不相信Quarkus团队测试正确的情况下才有意义;)我正在验证我的逻辑是否返回错误或数据,即使重试也是如此。我不测试重试逻辑。