代码之家  ›  专栏  ›  技术社区  ›  David Mason

在JUnit(4.8.1)测试套件中分配静态final int

  •  1
  • David Mason  · 技术社区  · 15 年前

    我有一个JUnit测试类,其中有几个 static final int 可以在测试仪代码顶部重新定义,以允许测试值发生某些变化。我在@beforeclass方法中有逻辑来确保开发人员输入的值不会破坏我的测试。

    如果开发人员设置了 boolean useRandomValues = true; . 我可以简单地移除 final 允许随机值覆盖初始化值的关键字,但我有 最终的 以确保这些值不会被无意更改,因为有些测试依赖于这些值的一致性。

    1. 我可以在JUnit测试类中使用构造函数吗?如果我试图将@beforeclass设置为测试类的构造函数,eclipse开始在每个地方都加上红色下划线,并且创建一个单独的构造函数似乎不允许对这些变量进行赋值(即使我在声明时让它们保持未赋值状态);

    2. 是否有其他方法可以确保在@beforeclass方法之后更改这些变量的任何尝试都将导致编译时错误?

    3. 我能做最后的决定吗 之后 它已经被初始化了?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Matthew Flaschen    15 年前

    可以使用静态构造函数执行此操作:

    import java.util.Random;
    public class StaticRandom
    {
      private static final boolean useRandomValues = true;
      private static final Random r = new Random();
      private static final int value1;
      private static final int value2;
      private static final int value3;
      static
      {
        if(useRandomValues)
        {
          value1 = r.nextInt();
          value2 = r.nextInt();
          value3 = r.nextInt();
        }
        else
        {
          value1 = 0;
          value2 = 0;
          value3 = 0;
        }
      }
    }
    
        2
  •  2
  •   miorel    15 年前

    可以使用静态初始值设定项:

    final static boolean useRandomValues = true;
    
    final static int valueA;
    final static int valueB;
    static {
        if(!useRandomValues) {
            valueA = 42;
            valueB = 1337;
        }
        else {
            Random rnd = new Random();
            valueA = rnd.nextInt(100);
            valueB = rnd.nextInt(100);
        }
    }