Я пытаюсь создать класс модульного теста, чтобы проверить созданный мной класс.Этот класс пытается отправить сообщение и, если ему не удается отправить, он будет экспоненциально ждать (1 с, 2 с, 4 с, 8 с и т. Д.), Прежде чем попытается отправить сообщение.Я хочу проверить, правильно ли работает это экспоненциальное ожидание.Но я новичок в модульном тестировании и не совсем уверен, как пройти тестирование с использованием JUnit и Mockito.Любая помощь будет принята с благодарностью!
@Slf4j
@Setter
@RequiredArgsConstructor
@AllArgsConstructor(access = AccessLevel.PACKAGE)
public class RetriableProcessorExponentialDecorator implements
AbsMessageProcessorDecorator {
private final AbsMessageProcessor messageProcessor;
@Autowired
private AbsMessageActiveMQConfiguration configuration;
@Override
public void onMessage(AbsMessage message) throws Exception {
int executionCounter = 0;
long delay = 1000;
final int maxRetries = this.configuration.getExceptionRetry() + 1;
do {
executionCounter++;
try {
this.messageProcessor.onMessage(message);
} catch (RetriableException e) {
log.info("Failed to process message. Retry #{}", executionCounter);
delay = (long) (delay * (Math.pow(this.configuration.getMultiplier(), executionCounter)));
Thread.sleep(delay);
} catch (Exception e) {
// We don't retry on this, only RetriableException.
throw e;
}
} while (executionCounter < maxRetries && delay < Long.MAX_VALUE);
}
}
PS. По предложению @Andy Turner я добавил строку private final DefaultSleeper defaultSleeper;
в свой класс RetriableProcessorExponentialDecorator , а затем заменил Thread.sleep(delay)
на defaultSleeper.sleep(delay)
.
*.1010 * Затем в своем модульном тестовом классе я издевался
DefaultSleeper , выполняя
@Mock
private DefaultSleeper sleeper;
, и передавал фиктивный объект через конструктор
RetriableProcessorExponentialDecorator , как показано ниже:
@Before
public void setUp() {
this.decorator = new
RetriableProcessorExponentialDecorator(sleeper, processor,
configuration);
}
Я на правильном пути?