我有以下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实例?
答案 0 :(得分:1)
虽然我找不到解决此问题的方案,但我确实找到了解决方法。我正在使用Maven,这允许我通过配置分叉来创建一个新的jvm进程。这样,根据配置,我可以指示何时终止用于运行powermock单元测试的jvm进程。这样,内存泄漏不会导致内存不足。见http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html
答案 1 :(得分:0)
在PowerMockito中有一个与此相关的未解决问题。