【问题标题】:Initializing a static final variable in a mock在模拟中初始化静态最终变量
【发布时间】:2015-05-05 02:40:12
【问题描述】:

我想在模拟类和非模拟类时以不同方式初始化一个类的静态最终变量。有没有办法做到这一点?

类似:

public class Test {    
   private static final Integer a = getA();

   private static Integer getA() {
      if(mocked) {
         return x;
      } else {
         return y;
      }
}

【问题讨论】:

    标签: java mocking mockito powermockito


    【解决方案1】:

    我认为这是一个坏主意(因为您不应该检查您的实例是否被模拟,我认为这会破坏模拟的目的),但您当前的方法看起来几乎正确。我假设您想指定 getA() 返回 int

    private static int getA() {
    }
    

    当然,您的方法本身似乎毫无意义 - 在这种情况下,您可能会使用 Conditional Operator ? : 之类的

    private static final Integer a = mocked ? x : y;
    

    【讨论】:

    • 其实我应该更好地表达这个问题。我如何知道在初始化静态最终变量时模拟了一个类,即如何确定模拟变量的值?请注意,我不能使用 new MockUtil().isMock(this) 来执行此操作。
    【解决方案2】:

    这就是静态不利于单元测试的原因。最好的解决方案是将静态转换为实例方法,然后添加一些间接方法,以便您的单元测试可以模拟/实现/覆盖该方法。唯一的其他选择是使用反射来强制覆盖单元测试中的值,这显然更脆弱(并且不利于在同一进程/类加载器中运行许多单元测试)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2020-03-01
      相关资源
      最近更新 更多