Java / Mockito - модульный тест для экспоненциального сна потока перед повторной попыткой - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь создать класс модульного теста, чтобы проверить созданный мной класс.Этот класс пытается отправить сообщение и, если ему не удается отправить, он будет экспоненциально ждать (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);

}

Я на правильном пути?

1 Ответ

0 голосов
/ 07 февраля 2019

Создайте интерфейс примерно так:

interface Sleeper {
  void sleep(long delay) throws InterruptedException;
}

Затем вы можете создать реализацию этого:

class DefaultSleeper implements Sleeper {
  @Override public void sleep(long delay) throws InterruptedException { 
    Thread.sleep(delay);
  }
}

и смоделировать его: Sleeper sleeper = mock(Sleeper.class);.

Теперь вы можете добавить экземпляр этого в RetriableProcessorExponentialDecorator и проверить взаимодействие с макетом в вашем тесте.

...