Как макетировать параметры аннотации jcabi

У меня есть код, как показано ниже.

@RetryOnFailure(attempts = Constant.RETRY_ATTEMPTS, delay = Constant.RETRY_DELAY, unit = TimeUnit.SECONDS)
public void method() {
    // some processing
    //throw exception if HTTP operation is not successful. (use of retry)
}

Значения переменных RETRY_ATTEMPTS и RETRY_DELAY взяты из отдельного класса Constant, который является примитивным int. Обе переменные определены как public static final.

Как я могу переопределить эти значения при написании модульных тестов. Фактические значения увеличивают время работы юнит-тестов.

Я уже попробовал два подхода: оба не работали

  1. Использование PowerMock с Whitebox.setInternalState().
  2. Используя Reflection также.

Редактировать:
Как упомянул @yegor256, что это невозможно, я хотел бы знать, почему это невозможно? Когда эти аннотации загружаются?

1 ответ

Решение

Нет способа изменить их во время выполнения. Что вы должны сделать, чтобы сделать ваш method() Тестируемый должен создать отдельный класс "декоратор":

interface Foo {
  void method();
}
class FooWithRetry implements Foo {
  private final Foo origin;
  @Override
  @RetryOnFailure(attempts = Constant.RETRY_ATTEMPTS)
  public void method() {
    this.origin.method();
  }
}

Затем, в целях тестирования, используйте другую реализацию Foo:

class FooWithUnlimitedRetry implements Foo {
  private final Foo origin;
  @Override
  @RetryOnFailure(attempts = 10000)
  public void method() {
    this.origin.method();
  }
}

Это лучшее, что вы можете сделать. К несчастью.

Другие вопросы по тегам