Как макетировать параметры аннотации 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.
Как я могу переопределить эти значения при написании модульных тестов. Фактические значения увеличивают время работы юнит-тестов.
Я уже попробовал два подхода: оба не работали
- Использование PowerMock с Whitebox.setInternalState().
- Используя 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();
}
}
Это лучшее, что вы можете сделать. К несчастью.