内存泄漏简单powermockito测试

时间:2018-02-07 13:39:09

标签: memory-leaks mockito powermock 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附加到它上面时,很明显我有内存泄漏。

visualvm memory leak by powermockito

我注意到,对于每个使用PowerMockRunner.class注释的测试类,都会创建一个MockClassloader实例,该实例持有对DaoCaseTypeDefinition的引用。不幸的是,mockclassloader实例永远不会被恢复。

我的测试中有什么东西我做错了吗?为什么垃圾收集没有清除mockclassloader实例?

2 个答案:

答案 0 :(得分:1)

虽然我找不到解决此问题的方案,但我确实找到了解决方法。我正在使用Maven,这允许我通过配置分叉来创建一个新的jvm进程。这样,根据配置,我可以指示何时终止用于运行powermock单元测试的jvm进程。这样,内存泄漏不会导致内存不足。见http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

答案 1 :(得分:0)

在PowerMockito中有一个与此相关的未解决问题。

https://github.com/powermock/powermock/issues/227