NotifyBuilder.matches () всегда истекает - PullRequest
0 голосов
/ 16 января 2019

Я хотел бы проверить логику повторов, встроенную в мое определение маршрута Camel.

from(somewhere)
.errorHandler(
   defaultErrorHandler()
   .log("something")
   .maxRedeliveries(3)
 )
.to(somewhere-else)

Для этого я написал тест, намеренно поднять исключение.

int counter = 0;
@Test
public void simulateError() throws Exception {
  NotifyBuilder nb = new NotifyBuilder(mock.getCamelContext()).whenDone(3).create();
  mock.whenAnyExchangedReceived(
    new Processor() {
      @Override
      public void process(Exchange exchange) throws Exception {
        counter++;
        throw new FooException("Error during processing: " + counter);
      }
    }
  );
  template.sendBody(somewhere, "some message");
  boolean matches = nb.matches(8, TimeUnit.SECONDS);
  assertEquals("Exception raised", 3, counter);
}

Теперь это работает нормально. Однако, если я утверждаю на matches, добавив

assertTrue(matches)

Не удалось. Другими словами, критерий соответствия NotifyBuilder никогда не выполняется, и он всегда истекает.

Почему это? Это потому, что повторы не считаются exchange доставками?

Каков канонический способ проверки того, что повторная доставка предпринята ожидаемое число раз?

1 Ответ

0 голосов
/ 16 января 2019

Завершение цикла и ответ на мой собственный вопрос.

Во-первых - Действительно, повторные попытки не учитываются при выполненных -сообщениях.

Как отметил Клаус Ибсен, предпочтительным (самым коротким?) Решением является проверка того, что макет получает ожидаемое количество сообщений. Это будет max_retries + 1 (4 в моем случае). Так что рабочий код выглядит как

@Test
public void simulateError() throws Exception {
    /*
     * Verify the error handling logic by checking the number of messages that are delivered.
     * It must be 1 + number of retries.
     */
    mock.expectedMessageCount(maxRetries + 1);
    mock.setAssertPeriod(6000); // Necessary to ensure the message count is treated as an exact number.
    mock.whenAnyExchangeReceived(new Processor() {

        @Override
        public void process(Exchange exchange) throws Exception {
            System.out.println("Intercepted to-endpoint");
            ProcessingFailedException e = new FooException("Error during processing");
            exchange.setException(e);

            throw e;
        }
    });
    producerTemplate.sendBody(umbFrom, "Hello world");
    mock.assertIsSatisfied();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...