2016-07-25 48 views
4

我有一個JUnit測試套件,包含800個測試。其中大部分與Spring連接,並且大量使用Mockito模擬/間諜行爲。我開始遇到內存不足的錯誤。在分析hprof轉儲時,我注意到,在測試之間保留的Mockito InvocationImpls消耗了> 30%的堆。Mockito InvocationImpl保留在TestSuite測試中

在測試課程完成後有什麼方法可以清除這些問題嗎?我不想使用Mockito.reset(模擬),因爲模擬初始化隨着每個測試而變化。如果沒有,看來我需要分解測試以適應泄漏。

this link看來,Mockito團隊認爲這些保留作爲驗證執行後方法的權衡。但是我想知道是否有人找到了一種方法來清除它們,因此大量的單元測試可以在一個套件中串聯起來。

回答

2

我發現了一個部分的工作。在我的情況下,大多數InvocationImpl實例是在單個測試用例中創建的,該測試用例使用spy()創建真實部分模擬,因此可以覆蓋一個方法。我使用Mockito 1.10.19,因此我將部分模擬構造從spy()切換到mock(<class>, withSettings().spiedInstance(realInstance).defaultAnswer(CALLS_READ_MATHODS).stubOnly())

雖然這防止了該模擬使用verify(),所述stubOnly()保持模擬從存儲InvocationImpl實例在測試過程中,以間諜的每次調用,和堆使用顯著降低。

由於我的Mocks通常是在Spring上下文文件中使用Springockito創建的,所以我需要對Bean定義進行醜陋的重做以匹配mock()調用,如下所示。但是這允許間諜在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>