JUnit - 我是否应该将 null 分配给在 setUp 中实例化的 tearDown 中的资源?

2022-09-04 03:09:49

我现在正在阅读一本关于JUnit的书,作者建议用 tearDown 方法清空资源。为什么?这不是GC的工作吗?它会严重造成任何伤害吗?

让我们这样想个例子:

public class SomeTest extends TestCase {
  Vector vector;
  List<Object> list;  

  protected void setUp() {
    vector = new Vector();
    list = new ArrayList<Object>();
  }

  // messing with resources
  // adding, deleting, testing whatever

  protected void tearDown() {
    vector = null;
    list = null;
  }
}

你觉得怎么样?拆解中的代码是必要的吗?


答案 1

是的,这确实是必要的。

你看,JUnit 实际上会为每个测试方法创建一个单独的类实例,而 Junit3 测试运行程序(JUnit4 不是这样)将保留这些实例,直到整个测试套件完成。Test

因此,如果 (JUnit3) 测试类具有占用大量内存的字段,则在具有大量测试方法时,很容易耗尽堆空间。当然,如果示例代码中的这些集合只包含少量短字符串,则无关紧要。


答案 2

这取决于您认为的资源。虽然堆空间是一种资源,但你可能会逃脱 GC 清理你 (YMMV).

可能导致问题的事情是数据库连接/打开的文件和流等,在使用后应始终关闭,以防止长时间运行的代码中出现令人讨厌的情况。Closable

我曾经遇到过一种情况,即某些休眠代码的集成测试没有正确清理,并导致一些非常奇怪的错误。我花了好几个小时才找到,这让我非常生气,以至于我再也不会犯同样的错误了。


推荐