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_ATTEMPTSRETRY_DELAY变量的值来自一个单独的常量类,它们是 int 原语。两个变量都定义为public static final

在编写单元测试用例时如何覆盖这些值。实际值会增加单元测试用例的运行时间。

我已经尝试过两种方法:两者都不起作用

  1. 将 PowerMock 与 Whitebox.setInternalState() 一起使用。
  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 回答