Vertx unit test не выполняется, исключение тайм-аута - PullRequest
1 голос
/ 20 июня 2020

У меня есть приведенный ниже простой класс повтора. Этот класс будет повторять данное обещание несколько раз (retryCount) с заданной задержкой (delay), если он преуспевает в пределах счетчика повторных попыток, он проходит, иначе он терпит неудачу.

public class SimpleRetry {

  private final Vertx vertx;

  public SimpleRetry(Vertx vertx) {
    this.vertx = vertx;
  }

  
  public <T> Promise<T> retryWithDelay(Promise<T> promise, int retryCount, int delay, TimeUnit unit) {
    log.debug("Retrying operation with : " + retryCount + " retry count and delay of " + delay);
    return execute(promise, retryCount, delay, unit);
  }


  private <T> Promise<T> execute(Promise<T> promise, int count, int delay, TimeUnit unit) {
    Promise<T> newPromise = Promise.promise();
    if (count > 0) {
      promise.future().onComplete(handler -> {
        if (handler.succeeded()) {
          log.debug("Retry operation successful");
          newPromise.complete(handler.result());
        } else {
          log.debug("Operation failed, hence retrying again..");
          if (delay > 0) {
            vertx.setTimer(unit.toMillis(delay), id -> execute(promise, count - 1, delay, unit));
          } else {
            execute(promise, count - 1, delay, unit);
          }
        }
      });
    } else {
      log.debug("Retry count exceeded, hence failing the promise..");
      newPromise.fail("Retry count exceeded!.");
    }
    return newPromise;
  }

Написано приведенный ниже тестовый пример, чтобы проверить это. Но это не выполняется. вместо этого истекает время ожидания.

@RunWith(VertxUnitRunner.class)
public class SimpleRetryTests {

  private SimpleRetry simpleRetry;
  private Vertx vertx;
  private static int count;

  @Before
  public void setUp(TestContext context){
    vertx = Vertx.vertx();
    simpleRetry = new SimpleRetry(vertx);
    count = 0;
    context.asyncAssertSuccess();
  }

  @Test
  public void testSimpleRetryWhichPassesOnFirstTry(TestContext context){
    final Async async = context.async();
    simpleRetry.retryWithDelay(dummyPromise(1), 10, 10, TimeUnit.MILLISECONDS)
        .future().onSuccess(res -> {
      System.out.println("Promise completed");
      context.asyncAssertSuccess();
      async.complete();
    }).onFailure(ex -> {
      System.out.println("Promise failed : " + ex);
      context.asyncAssertFailure();
      async.complete();
    });
  }

  //A dummy promise which only passes when called 5 times.
  private Promise<Void> dummyPromise(int passCount){
    Promise<Void> promise = Promise.promise();
    vertx.setTimer(10, id->{
      count++;
      if(count == passCount) {
        promise.complete();
      } else {
        promise.fail("Error!!");
      }
    });
    return promise;
  }

  @After
  public void tearDown(TestContext context){
    simpleRetry = null;
    vertx.close(context.asyncAssertSuccess());
  }
}

Что я делаю не так? Заранее спасибо.

1 Ответ

1 голос
/ 22 июня 2020

Вы неправильно используете context.asyncAssertSuccess() и context.asyncAssertFailure(), это остановит ваш код, например, ваша функция setUp никогда не завершится. Выньте их, и ваш тест будет пройден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...