我在@BeforeClass
中创建了几个静态变量。我应该在@AfterClass
中将它们设置为null吗?这些是与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;
}
}
简短回答:
对于静态成员:对于JUnit3和JUnit4,静态成员永远不符合垃圾收集的条件,除非显式地取消它们的引用(例如在@AfterClass
方法中)。
对于非静态成员:如果您使用JUnit3,那么在@After
方法中取消非静态成员变量是一种很好的做法。如果您将JUnit4与默认的测试运行程序一起使用,那么这种做法是不必要的。
长答案:
JUnit为中存在的每个测试方法创建一个单独的测试类实例。JUnit3会保留对所有这些实例的引用,直到测试套件完成执行为止,因此在tearDown()
方法中清除这些引用是一种很好的做法。(当然,由于静态变量所属类的所有实例中只存在一个实例,因此这对非静态变量更为重要。)
JUnit4仍然可以为每个测试方法创建一个单独的测试类实例,但只要你使用默认的测试运行器,它就只保留对当前执行的测试所属的测试类的实例的引用,非静态成员变量将被清除,即使您没有在tearDown()
方法中显式地使它们无效。
然而,请注意,如果您使用自定义JUnit4测试运行器(通过@RunWith
注释),则无法保证它将在对测试类实例的引用周围保留多长时间。
静态变量一直存在,直到JVM终止。如果有理由使它成为静态的(它被多个测试使用,初始化成本很高),那么可以随意这样做,只需在完成测试后将其清理干净即可。
对于非静态,正如其他人所说,JUnit将自己清理这些。
好的测试不必自己清理。他们应该只准备数据。其他测试不应该依赖于这些数据。在实践中,有时您需要关闭数据库连接或清理一些其他长期资源。然而,一些纯粹主义者会说,在这种情况下,它不再是单元测试了。如果您使用设计糟糕的遗留代码,有时您必须清理所使用框架的一些静态变量(例如springSecurityContext)。通常可以重构这样的代码以避免这种清理