1

以下のようなコードがあります。

@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変数の値は、int プリミティブである別のConstantクラスから取得されます。どちらの変数もpublic static finalとして定義されています。

単体テストケースの作成中にこれらの値をオーバーライドするにはどうすればよいですか。実際の値により、単体テストケースの実行時間が長くなります。

私はすでに2つのアプローチを試しました:両方ともうまくいきませんでした

  1. Whitebox.setInternalState() で PowerMock を使用する。
  2. リフレクションも使用します。

編集:
@ yegor256が述べたように、それは不可能です。なぜそれが不可能なのか知りたいのですが? これらの注釈はいつロードされますか?

4

1 に答える 1

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();
  }
}

それがあなたにできる最善のことです。不運にも。

于 2015-09-26T21:19:50.737 に答える