我有两个问题:
1。)关于蜕皮的泪下方法。 人们说通常的做法是将所有模拟设置为以下拆解方法中的null:
public void tearDown(){
mockOne=null;
mockTwo=null;
}
我想知道这真的有意义还是我们应该在tearDown做一些有用的事情? JVM不会注意使模拟无效吗?
感谢。
答案 0 :(得分:1)
至于你的第一点,我会说我个人很少使用tearDown()方法,当然不会失去对mock对象的引用。我并不倾向于相信“人”。
至于你的第二点,只需在最小范围内声明你的变量,因为最重要的是你的测试既捕获了一些必需的行为又很容易被理解。
按照惯例,保持简单并努力在每次测试中进行非常小的设置(安排),测试主题(Act)和验证(Assert)的调用。如果您遇到此问题,则表明您的测试对象(或被测试的课程)可能做得太多。
答案 1 :(得分:0)
1。
我不认为你的tearDown
做了很多有用的事情。您的测试用例通常会在生产服务器VM
的不同VM
上运行,因此不需要对GC
这么谨慎(如果这是设置模拟的意图)到null
是。测试类创建的存根中的模拟对象一旦超出范围就有资格获得GC
,这在执行所有测试用例并退出JVM
后最差。 。
当然可能帮助garbage-collector
尽快回收这些资源,但除非你运行一大堆单元测试,否则这不是问题。
另一方面,如果想要确保通过一种测试方法对模拟对象所做的更改不会影响另一种后续测试方法,那么这在某种程度上是有道理的。
不要过度思考这些fixtures
- 为后续的测试用例设置一些东西吗?在@Before
带注释的setUp
方法中执行此操作。有类似清理数据库连接和系统资源等资源的东西吗?在After
带注释的tearDown
方法中执行此操作。
通常情况下,您甚至不会编写tearDown
方法,除非您遇到上述要求之一,这与setUp
方法不同,后者可能对您有用。
2。
上面的第一点部分回答了与内存占用相关的问题。单元测试没有必要那么谨慎。
您通常不会编写长时间运行的进程的单元测试。
此外,创建靠近您使用它们的对象并将其范围和暴露限制在所需的最小值通常是一种很好的做法 - 所以如果您不打算重复使用对象/模拟,请随意创建它们(和因此,一旦测试方法在测试方法中完成执行,它们就会超出范围。