YoungHobbit
YoungHobbit

Reputation: 13402

How mock jcabi annotation parameters

I have some code like below.

@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)
}

The value of RETRY_ATTEMPTS and RETRY_DELAY variable come from a separate Constant class, which are int primitive. Both the variable are defined as public static final.

How can I override these values while writing the unit testcases. The actual values increases running time of unit testcases.

I have already tried two approach: Both did not work

  1. Using PowerMock with Whitebox.setInternalState().
  2. Using Reflection as well.

Edit:
As mentioned by @yegor256, that it is not possible, I would like to know, why it is not possible? When these annotations get loaded?

Upvotes: 1

Views: 261

Answers (1)

yegor256
yegor256

Reputation: 105043

There is no way to change them in runtime. What you should do, in order to make your method() testable is to create a separate "decorator" class:

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

Then, for test purposes, use another implementation of Foo:

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

That's the best you can do. Unfortunately.

Upvotes: 1

Related Questions