我在@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;
}
}
答案 0 :(得分:8)
简答:
对于静态成员:对于JUnit3和JUnit4,静态成员永远不能进行垃圾收集,除非您明确地使其引用无效(例如在@AfterClass
方法中)。
对于非静态成员:如果您正在使用JUnit3,那么最好在@After
方法中使非静态成员变量无效。如果您将JUnit4与默认测试运行器一起使用,那么这种做法是不必要的。
长答案:
JUnit为该类中存在的每个测试方法创建一个单独的测试类实例。 JUnit3保留对所有这些实例的引用,直到测试套件完成执行,因此最好在tearDown()
方法中清理这些引用。 (当然,因为它所属的类的所有实例中只存在一个静态变量实例,所以对非静态变量更为重要。)
JUnit4仍然有为每个测试方法创建测试类的单独实例的行为,但只要您使用默认测试运行器,那么它只保留对测试类实例的引用,目前执行测试属于。因此,即使您未在tearDown()
方法中明确废除非静态成员变量,也会清除非静态成员变量。
但请注意,如果您使用自定义JUnit4测试运行器(通过@RunWith
注释),则无法保证对测试类实例的引用保留多长时间。
答案 1 :(得分:2)
静态变量一直存在,直到JVM终止。如果有理由将其设置为静态(它被多次测试使用并且初始化成本很高),那么请随意这样做,只需在完成它们后进行清理。
对于非静态,正如其他人所说,JUnit会自行清理它们。
答案 2 :(得分:0)