Mockito InvocationImpl在整个TestSuite测试中保留



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

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

从这个链接来看,Mockito团队似乎认识到,这些是作为执行后验证方法的权衡而保留的。但我想知道是否有人找到了清除这些内容的方法,这样大量的单元测试就可以在一个Suite中串在一起了。

我找到了部分解决方案。在我的案例中,绝大多数InvocationImpl实例都是在单个测试用例中创建的,该测试用例使用spy()创建Real Partial Mock,因此可以覆盖一个方法。我使用的是Mockito 1.10.19,所以我将部分mock构造从spy()切换到了mock( <class>, withSettings().spiedInstance( realInstance ).defaultAnswer( CALLS_READ_MATHODS ).stubOnly() )

虽然这阻止了在此mock上使用verify(),但stubOnly()阻止mock为测试期间对spy的每次调用存储InvocationImpl的实例,并显著减少了堆使用。

由于我的Mock通常是在Spring上下文文件中使用Springockito创建的,所以我需要对bean定义进行一次丑陋的返工,以匹配mock()调用,如下所示。但这允许间谍在Spring有线域类中使用。

  <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>

相关内容

  • 没有找到相关文章

最新更新