2

我目前在我的一个相当大的项目中遇到一些单元测试的内存问题。在我今天拉头发和研究的过程中,我开始意识到这似乎与清理物体的速度并不总是像我认为应该清理的那样快有关。我开始研究“cleanup mockito”和“cleanup junit”,并遇到了一些关于如何使用@Before@After(以及它们的 *Class 版本)做你不想在每个单元上完成的激烈事情的博客和论坛帖子测试。这让我想到了 Mockito@Mock@InjectMocks注释。

有人可以详细描述一下在maven构建期间如何在内存中处理下面的类变量吗?对象是在单元测试之前、期间还是之后创建的?最后一次单元测试完成后,对象是否立即销毁?我应该使用@After将所有类变量设置为空吗?

多次感谢。这是我可能使用的测试用例示例:

@RunWith(MockitoJUnitRunner.class)
public class thisCustomTest {

    @Mock
    MyCustomSpringBean myCustomerSpringBean;

    @InjectMocks
    MyBeanToTest myBeanToTest;

    @Before
    public void config() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void someTest() {
        //code here
    }

}

只是为了在最后做一个快速总结/总结,我的主要问题是我是否应该使用诸如@After清理类变量之类的东西,或者我应该简单地将它们留给 Java 的正常范围垃圾收集......

我的清理思路:

@After
public void cleanup() {
    mockedClassVariable = null;
    injectedVariable = null;
}
4

1 回答 1

6

JUnit 在运行每个测试方法之前创建单元测试类的新实例。创建实例后,将@Before执行其带注释的方法。然后执行测试方法。然后,无论测试方法中发生了什么(成功、失败或错误),@After 注释方法都会运行。

因此,在这种特殊情况下,MockitoAnnotations.initMocks(this)在每个测试方法之前执行,它每次都会创建一个新的模拟,每次都会创建一个新的 MyBeanToTest,并将模拟注入到 bean 中进行测试。

在测试方法执行后,这些 bean 以及引用它们的测试实例将有资格进行 GC。在清理方法中将它们设置为 null 没有任何用途。

于 2013-07-25T07:07:07.430 回答