内存泄漏简单powermockito测试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存泄漏简单powermockito测试相关的知识,希望对你有一定的参考价值。
我有以下powermock测试:
@RunWith(PowerMockRunner.class)
@PrepareForTest({DaoCaseTypeDefinition.class, QDataContext.class})
public class PowermockTest {
private static QDataContext m_dc;
private static DaoCaseTypeDefinition m_daoCaseTypeDefinition;
@Test
public void test() throws Exception {
m_dc = mock(QDataContext.class);
m_daoCaseTypeDefinition = mock(DaoCaseTypeDefinition.class);
when(m_daoCaseTypeDefinition.findAll(m_dc)).thenReturn(Collections.EMPTY_LIST);
DaoCaseTypeDefinition daoCaseTypeDefinition = new DaoCaseTypeDefinition();
List<CaseTypeDefinition> all = daoCaseTypeDefinition.findAll(m_dc);
System.out.println("sleep");
Thread.sleep(2000);
}
@AfterClass
public static void after() throws InterruptedException {
m_daoCaseTypeDefinition = null;
m_dc = null;
System.out.println("done");
Thread.sleep(2000);
}
}
在这个测试中,我在jdk1.8上使用powermockito 1.7.1(也使用了powermockito 2 btw)。当我让Intellij一遍又一遍地运行这个测试并将visualvm附加到它上面时,很明显我有内存泄漏。
我注意到,对于每个使用PowerMockRunner.class注释的测试类,都会创建一个MockClassloader实例,该实例保存对DaoCaseTypeDefinition的引用。不幸的是,mockclassloader实例永远不会被恢复。
我的测试中有什么东西我做错了吗?为什么垃圾收集没有清除mockclassloader实例?
答案
虽然我找不到解决这个问题的方法,但我确实找到了解决方法。我正在使用Maven,这允许我通过配置分叉来创建一个新的jvm进程。这样,根据配置,我可以指示何时终止用于运行powermock单元测试的jvm进程。这样,内存泄漏不会导致内存不足。见http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html
以上是关于内存泄漏简单powermockito测试的主要内容,如果未能解决你的问题,请参考以下文章