Java 如何以及何时使用带有jUnit的Mockito注释进行清理
我目前在一个相当大的项目中的一些单元测试中遇到了一些内存问题。今天,通过我的头发拉扯和研究,我逐渐意识到这似乎与物体不总是像我认为应该清理的那样快速清理有关。我开始研究“cleanup mockito”和“cleanup junit”,并在博客和论坛上看到了一些关于如何使用Java 如何以及何时使用带有jUnit的Mockito注释进行清理,java,unit-testing,junit,garbage-collection,mockito,Java,Unit Testing,Junit,Garbage Collection,Mockito,我目前在一个相当大的项目中的一些单元测试中遇到了一些内存问题。今天,通过我的头发拉扯和研究,我逐渐意识到这似乎与物体不总是像我认为应该清理的那样快速清理有关。我开始研究“cleanup mockito”和“cleanup junit”,并在博客和论坛上看到了一些关于如何使用@Before和@Before(以及它们的*类版本)来做你不希望在每个单元测试中都做的激烈的事情的帖子。这让我想到了Mockito的@Mock和@InjectMocks注释 有人能详细描述一下在maven构建过程中如何在内存中
@Before
和@Before
(以及它们的*类版本)来做你不希望在每个单元测试中都做的激烈的事情的帖子。这让我想到了Mockito的@Mock
和@InjectMocks
注释
有人能详细描述一下在maven构建过程中如何在内存中处理下面的类变量吗?对象是在单元测试之前、期间还是之后创建的?在最后一次单元测试完成后,对象是否立即被销毁?我应该在之后使用@将所有类变量设置为null吗
多谢了。下面是我可以使用的测试用例示例:
@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;
}
JUnit在运行每个测试方法之前创建单元测试类的新实例。创建实例后,将执行其
之前的注释方法。然后执行测试方法。然后,不管测试方法中发生了什么(成功、失败或错误),都会运行@After注释的方法
因此,在这种特殊情况下,MockitoAnnotations.initMocks(this)
在每个测试方法之前执行,它每次创建一个新的mock,每次创建一个新的MyBeanToTest,并将mock注入bean中进行测试
在测试方法执行之后,这些bean以及引用它们的测试实例将符合GC的条件。在cleanup方法中将它们设置为null没有任何作用。感谢您的解释。我知道这是一个广泛的问题,但我想确保我不是因为睡眠不足而写了一堆冗余代码。我想我今晚到此为止,明天再重新开始我的内存问题。应该注意的是,根据Mockito文档,您应该只在
@Before
方法中使用MockitoAnnotations.initMocks(this)
,或者在运行程序@RunWith(MockitoJUnitRunner.class)
中使用。使用这两种方法将创建两个模拟。