我發現了一個部分的工作。在我的情況下,大多數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>