在 JUnit 的 class 级别的 tearDown 方法和变量中将所有模拟设置为 null

Setting all mocks to null in tearDown method & variables at class level in JUnit

我有两个问题:

1.) 关于 mocks 的 tearDown 方法。 人们说在拆解方法中将所有模拟设置为 null 是一种常见的做法,如下所示:

public void tearDown(){
   mockOne=null;
   mockTwo=null;
}

我想知道这是否真的有意义,或者我们应该在拆解中做一些有用的事情? JVM 不会注意使模拟无效?

  1. ) 此外,jUnit 中使用的所有变量是否都应定义在 class 级别或方法级别?我知道在 class 级别创建可以促进代码重用,但它不会在维护状态时一直占用内存吗?

谢谢。

1.

我认为您的 tearDown 没有做很多有用的事情。您的测试用例通常 运行ning 在与生产服务器 VM 不同的 VM 上,因此无需对 GC 如此谨慎(如果那是将模拟设置为 null 的意图是)。您的测试 类 创建的存根中的模拟对象一旦超出范围就符合 GC 的条件,这是最坏的情况,在执行所有测试用例并退出 JVM

当然,它 可能 帮助 garbage-collector 比没有它更快地回收这些资源,但除非你 运行 一个非常大的单元测试套件,这不会有问题。

另一方面,如果想法是确保通过一种测试方法对模拟对象所做的更改不会影响另一种后续测试方法,那么这在某种程度上是有道理的。

不要想太多 fixtures - 有什么要为后续测试用例设置的吗?在 @Before 注释的 setUp 方法中执行。有清理数据库连接和系统资源等资源的东西吗?在 After 注释的 tearDown 方法中执行。

通常情况下,您甚至不会编写 tearDown 方法,除非您遇到上述要求之一,而 setUp 方法可能对您更有用。

2.

我上面的第一点部分回答了您有关内存占用的问题。没有必要对单元测试如此谨慎。

您通常不会编写长 运行ning 进程的单元测试。

此外,在靠近您使用它们的地方创建对象并将它们的范围和暴露限制在所需的最低限度通常是一个好习惯 - 所以如果您不打算重用 objects/mocks,请随意在您的测试方法中创建它们(从而使它们在测试方法完成执行后立即超出范围)。

关于你的第一点,我想说我个人很少使用 tearDown() 方法,当然不会丢失对模拟对象的引用。我不太相信"people"那个。

关于你的第二点,只需在你可能的最小范围内声明你的变量,因为最重要的是你的测试既捕获了一些必需的行为又很容易理解。

像往常一样,保持简单,并努力在每个测试中进行最少的设置 (Arrange)、测试对象调用 (Act) 和验证 (Assert)。如果您对此有困难,则表明您的测试对象(或 class 正在测试)可能做得太多了。