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

时间:2010-03-21 22:45:43

标签: java junit

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

如果开发人员设置boolean useRandomValues = true;,我希望通过允许在@BeforeClass方法中将这些整数设置为(合理的)随机值来进一步改进变体。我可以简单地删除final关键字以允许随机值覆盖初始化值,但我有final以确保这些值不会无意中更改,因为某些测试依赖于这些值的一致性值。

  1. 我可以在JUnit测试类中使用构造函数吗?如果我试图将@BeforeClass变成测试类的构造函数,Eclipse会开始在任何地方放置红色下划线,并且创建一个单独的构造函数似乎不允许赋值给这些变量(即使我在声明时将它们保留为未分配); < / p>

  2. 还有另一种方法可以确保在@BeforeClass方法之后更改这些变量的任何尝试都会导致编译时错误吗?

  3. 我可以在初始化之后做出最终的吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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