Java 在TestSuite测试中保留Mockito调用impl

Java 在TestSuite测试中保留Mockito调用impl,java,memory-leaks,mockito,Java,Memory Leaks,Mockito,我有一个JUnit测试套件,有大约800个测试。其中大部分都与Spring连接,大量使用Mockito来模拟/监视行为。我开始遇到内存不足的错误。在分析hprof转储时,我注意到堆的30%以上被测试之间保留的Mockito调用占用 在测试类完成后,是否有办法清除这些内容?我不想使用Mockito.reset(mock),因为mock初始化随每个测试而变化。如果没有,我似乎需要将测试分开以适应泄漏 从表面上看,Mockito团队认识到,这些保留是执行后验证方法的一种折衷。但是我想知道是否有人找到了

我有一个JUnit测试套件,有大约800个测试。其中大部分都与Spring连接,大量使用Mockito来模拟/监视行为。我开始遇到内存不足的错误。在分析hprof转储时,我注意到堆的30%以上被测试之间保留的Mockito调用占用

在测试类完成后,是否有办法清除这些内容?我不想使用Mockito.reset(mock),因为mock初始化随每个测试而变化。如果没有,我似乎需要将测试分开以适应泄漏


从表面上看,Mockito团队认识到,这些保留是执行后验证方法的一种折衷。但是我想知道是否有人找到了一种方法来清除这些测试,这样大量的单元测试就可以在一个套件中串联起来。

我找到了一个解决方法。在我的例子中,绝大多数的
InvocationImpl
实例都是在一个测试用例中创建的,该测试用例使用
spy()
创建一个真正的部分模拟,因此可以覆盖一个方法。我使用的是Mockito 1.10.19,因此我将部分模拟结构从
spy()
切换到
mock(,withSettings().spiedInstance(realInstance).defaultAnswer(CALLS\u READ\u MATHODS.stubOnly())

虽然这样可以防止在此模拟上使用
verify()
,但是
stubOnly()
可以防止模拟为测试期间对spy的每次调用存储
InvocationImpl
的实例,并显著减少堆的使用

因为我的mock通常是用in-Spring上下文文件创建的,所以我需要对bean定义进行一次难看的修改,以匹配
mock()
调用,如下所示。但这允许spy在Spring wired域类中使用

  <bean id="realInstance" class="<Real Instance Class>" />
  <bean id="instSpySettings" class="org.mockito.Mockito" factory-method="withSettings" />
  <bean id="instSpyPartialMock" factory-bean="instSpySettings" factory-method="spiedInstance">
    <constructor-arg>
      <ref local="realInstance" />
    </constructor-arg>
  </bean>
  <bean id="instSpyDefaultAnswers" factory-bean="instSpyPartialMock" factory-method="defaultAnswer">
    <constructor-arg><util:constant static-field="org.mockito.Mockito.CALLS_REAL_METHODS"/></constructor-arg>
  </bean>
  <bean id="instSpyStubOnly" factory-bean="instSpyDefaultAnswers" factory-method="stubOnly" />
  <bean id="spyInstance" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="<Real Instance Class>" />
    <constructor-arg>
      <ref local="instSpyStubOnly" />
    </constructor-arg>
  </bean>