Пытаюсь внедрить мой издевательский Runnable в мой сервисный вызовJAVA

Программисты JAVA общаются здесь
Anonymous
Пытаюсь внедрить мой издевательский Runnable в мой сервисный вызов

Сообщение Anonymous »

Для контекста я использую Resilience4j для обработки исключений и повторных попыток. Это делается через RetryService.
В этой функции callRunnableWithRetry() есть два параметра. Первая — это строка, вторая — Runnable. Я разработал такую ​​функцию, чтобы сделать ее модульной, чтобы каждый мог обрабатывать любой блок кода, который захочет.
@Test
void testRetry(){
RetryService retryServiceSpy = spy(retryService);

ObjectA obj = new ObjectA("test-value");

Runnable mockRunnable = mock(Runnable.class);

doThrow(new RuntimeException("Simulated exception"))
.doThrow(new RuntimeException("Simulated exception"))
.doNothing()
.when(mockRunnable).run();

doAnswer(invocation -> {
String configName = invocation.getArgument(0);
Runnable actualRunnable = invocation.getArgument(1);
Retry retry = retryServiceSpy.getRetry(configName);

CheckedRunnable checkedRunnable = Retry.decorateCheckedRunnable(retry, actualRunnable::run);

try {
checkedRunnable.run();
} catch (Exception ignored) {
log.error("error: {}", ignored)
}
return null;
}).when(retryService).callRunnableWithRetry("test", mockRunnable);

serviceA.getData(obj);

verify(mockRunnable, times(3)).run();
}

Проблема
Как видите, я создаю макет, который дважды выдает исключения, а затем ничего не делает. Мне это нужно, чтобы я мог активировать функцию повторной попытки в моем runnable, который я передаю в callRunnableWithRetry() через resilience4j.
Когда я использую проверку, чтобы проверить, работает ли runnable.run( ) на самом деле назывался 3x Mockito, выдает эту ошибку.
Wanted but not invoked:
runnable.run();
-> at [redacted]
Actually, there were zero interactions with this mock.

Поэтому я также попытался создать шпион моего Runnable, а затем внедрить его в свой doAnswer(), чтобы таким образом я мог убедиться, что мой издеваемый Runnable действительно применяется в моем вызов serviceA.getData(), но даже это не сработало; но если кто-то сможет заставить его работать, поделитесь, пожалуйста.
Контекст
Если интересно, это RetryService
@Service
@Sl4j
public class RetryService {

private static final String RETRY_LOG_MESSAGE = "%s %s from service: %s" +
"\nattempts made: %s" +
"\nexception:\n```%s```";

public Retry getRetry(String retryName) {
//process to acquire Reslience4j retry object
...
return retry;
}

private void handleRetryEvents(Retry retry, String action) {
retry.getEventPublisher()
.onSuccess(event -> logEvent(action, false, event))
.onRetry(event -> logEvent(action, false, event))
.onError(event -> logEvent(action, true, event));
}

private void logEvent(String action, boolean isAlert, RetryEvent event) {
//maps data to RETRY_LOG_MESSAGE string
...
}

public CheckedRunnable callRunnableWithRetry(String configName, Runnable runnableFunc) {
Retry retry = getRetry(configName);
handleRetryEvents(retry, "read");
return decorateCheckedRunnable(retry, () -> runnableFunc.run());
}
}

А вот как мой код реализации выглядит в ServiceA
@Service
@Sl4j
public class ServiceA {
private final RetryService retryService;

public ServiceA(RetryService retryService){
this.retryService = retryService;
}
public void getData(ObjectA obj) {
try {
//processes data
...
retryService.callRunnableWithRetry(obj.getName(), () -> {
log.debug("Name: {}", obj.getName());
}).run();
} catch (Throwable e) {
log.error("error: {}", e);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... rvice-call

Вернуться в «JAVA»