Я использую Qurkus с Microprofile Fault Tolerance
для реализации допустимости фолтов в соединении JDBC (Dremio а>).
Я реализовал что-то вроде этого:
class Repository {
private final DataSource dataSource; //initialized on constructor
Collection<String> getData() exception SQLException {
try (var conn = dataSource.getConnection();
var stmt = conn.createStatement();
var rs = stmt.executeQuery(sql)) {
var result = new ArrayList<String>();
while (rs.next()) {
result.add(rs.getString("data"));
}
return result;
} catch(SQLException e) {
//log and throw custom exception
}
}
}
class Service {
@Inject
Repository repo;
public Collection<String> callService() {
//other code that dosen't require retries
try {
var res = getData();
} catch (Exception e) {
//log exception
throw new CustomException(e);
}
return res;
}
@Retry()
private Collection<String> getData() throw Exception {
return repo.getData();
}
}
Теперь я пытаюсь проверить повторную попытку с помощью модульного теста. Я не нашел документации, относящейся к Microprofile Fault Tolerance
.
@QuarkusTest
class ServiceTest {
@Inject
Service service;
@InjectMock
Repository repository;
@Test
void shouldHandleRetryWhenErrorOccursDuringQueryData() throws Exception {
ArrayList<String> expectedResult = Lists.newArrayList("1","2");
when(repository.getData())
.thenThrow(new RuntimeException("Runtime Exception"))
.thenReturn(expectedResult);
Collection<String> executionResult = service.callService();
assertIterableEquals(expectedResult, executionResult);
}
}
Я ожидаю, что данные вернутся после одной попытки (первый вызов getData
вернет ошибку). Вместо этого верните только ошибку.
Каков правильный способ проверки повторных попыток моего метода?