3

我在@BeforeClass. 我应该将它们设置为 null in@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;
   }    
}
4

3 回答 3

9

简短的回答:

对于静态成员:对于 JUnit3 和 JUnit4,静态成员永远不符合垃圾回收条件,除非您显式取消它们的引用(例如在@AfterClass方法中)。

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

长答案:

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

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

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

于 2012-12-06T23:12:51.347 回答
2

静态变量一直存在,直到 JVM 终止。如果有理由让它成为静态的(它被多个测试使用并且初始化成本很高)那么随意这样做,当你完成它们时清理它们。

对于非静态的,正如其他人所说,JUnit 将自行清理这些。

于 2012-12-17T19:17:56.583 回答
0

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

于 2012-12-08T12:18:45.490 回答