我应该在AfterClass(Java JUnit 4)中使静态变量无效吗?

时间:2012-12-06 22:45:58

标签: variables static junit null

我在@BeforeClass中创建了一些静态变量。我应该在@AfterClass中将它们设置为空吗?这些是非IO相关对象。

示例:

public class ClassTest{
   private static String staticText;   
   @BeforeClass
   public static void setUp(){
      staticText="long text";
   }
//test methods

//Is this necessary
@AfterClass
public static void tearDown(){
   staticText=null;
   }    
}

3 个答案:

答案 0 :(得分:8)

简答:

对于静态成员:对于JUnit3和JUnit4,静态成员永远不能进行垃圾收集,除非您明确地使其引用无效(例如在@AfterClass方法中)。

对于非静态成员:如果您正在使用JUnit3,那么最好在@After方法中使非静态成员变量无效。如果您将JUnit4与默认测试运行器一起使用,那么这种做法是不必要的。

长答案:

JUnit为该类中存在的每个测试方法创建一个单独的测试类实例。 JUnit3保留对所有这些实例的引用,直到测试套件完成执行,因此最好在tearDown()方法中清理这些引用。 (当然,因为它所属的类的所有实例中只存在一个静态变量实例,所以对非静态变量更为重要。)

JUnit4仍然有为每个测试方法创建测试类的单独实例的行为,但只要您使用默认测试运行器,那么它只保留对测试类实例的引用,目前执行测试属于。因此,即使您未在tearDown()方法中明确废除非静态成员变量,也会清除非静态成员变量。

但请注意,如果您使用自定义JUnit4测试运行器(通过@RunWith注释),则无法保证对测试类实例的引用保留多长时间。

答案 1 :(得分:2)

静态变量一直存在,直到JVM终止。如果有理由将其设置为静态(它被多次测试使用并且初始化成本很高),那么请随意这样做,只需在完成它们后进行清理。

对于非静态,正如其他人所说,JUnit会自行清理它们。

答案 2 :(得分:0)

好的测试不需要自己清理。他们应该只准备数据。其他测试不应该依赖于这些数据。在实践中,有时您需要关闭数据库连接或清理其他一些长期资源。然而,在这种情况下,一些纯粹主义者会说它不再是单元测试。 如果你使用设计糟糕的遗留代码有时你必须清理你使用的框架的一些静态变量(例如spring SecurityContext)。通常这样的代码可以重构以避免这种清理