有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

跨TestSuite测试保留java Mockito调用impl

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    我找到了一份局部工作。在我的例子中,绝大多数InvocationImpl实例都是在单个测试用例中创建的,该测试用例使用spy()创建一个真正的部分模拟,因此可以重写一个方法。我使用的是mockito1.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()调用,如下所示。但这允许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>