带有静态字段的java测试对象

时间:2015-06-11 11:57:49

标签: java unit-testing static

我有静态字段的对象:

class Project() {
  private static id;
  private int projectid;

  public Project(fileds) {
    this.id = id++;
  }
  //methods
  }

现在我想用多个测试来测试这个类。问题是当一个测试完成后,我的对象不会从内存中删除:

@Test
public test1(){
  Project project1 = new Project();
  Project project2 = new Project();
}
@Test
public test2(){
  here the objects from previous tests are still exist since the   static    field is two times increased
}

有没有什么办法可以在每次测试后冲洗它们?因为我能克服它的唯一方法 - 使用忽略......

3 个答案:

答案 0 :(得分:3)

我认为写得不好。

如果我正确解释了这一点,您需要一个与静态计算所计算的每个实例关联的唯一projectid。像这样更改你的代码:

class Project() {
  private static int id;
  private int projectid;

  public Project(fileds) {
    // This notation makes clear that the static variable associated w/ class
    this.projectid = Project.id++;
  }
  //methods
}

这种方式projectid将从0开始,每次创建新实例时递增1。

你不应该担心潮红或项目ID是多少。这对您的方法测试来说并不重要。

如果必须重置为零,请将静态变量设为public:

class Project() {
  public static int id;
  private int projectid;

  public Project(fileds) {
    // This notation makes clear that the static variable associated w/ class
    this.projectid = Project.id++;
  }
  //methods
}

以下是您在测试中重置的方法(如果必须):

@Test
public test1(){
  Project.id = 0;
  Project project1 = new Project();
  Project project2 = new Project();
}
@Test
public test2(){
  // reset the count
  Project.id = 0;
  // here the objects from previous tests are still exist since the   static    field is two times increased
}

答案 1 :(得分:0)

静态对象在应用程序启动时创建,并且只有一个实例。它被称为Class variable。请参阅此SO question

因此,无论何时执行id++;,它实际上都会更新单个类级别的id对象。 this.id真的没有意义。

@duffymo正确指出。你需要在构造函数中使用它。

class Project { // removed "()" 
  private static int id; // added int
  private int projectid;

  public Project() { // removed fileds
    this.projectid = Project.id++; // updated
  }
  //methods
}

答案 2 :(得分:0)

首先,这是这种静态变量不受欢迎的主要原因。

如果你真的需要,你有几个选择:

  1. 使用类加载器卸载然后在测试之间重新加载类
  2. 使用内省重置测试之间的值,可能会将静态初始化为常量,然后您可以使用相同的常量来重置它