2016-07-25 15 views
4

Ich habe eine JUnit Test Suite mit ~ 800 Tests. Die meisten davon sind mit Spring verkabelt und eine große Anzahl benutzt Mockito, um sich zu verspotten. Ich fing an, Fehler wegen zu wenig Speicher auszulösen. Bei der Analyse des hprof Dumps habe ich festgestellt, dass> 30% des Heaps von Mockito InvocationImpls verbraucht werden, die zwischen den Tests gespeichert werden.Mockito InvocationImpl über TestSuite-Tests beibehalten

Gibt es eine Möglichkeit, diese nach Abschluss einer Testklasse zu löschen? Ich möchte Mockito.reset (mock) nicht verwenden, da die Mock-Initialisierung bei jedem Test variiert. Wenn nicht, scheint es, dass ich die Tests aufteilen muss, um das Leck aufzunehmen.

Von this link scheint es, dass das Mockito-Team erkennt, dass diese als Kompromiss der Überprüfung nach der Ausführung beibehalten werden. Aber ich frage mich, ob jemand eine Möglichkeit gefunden hat, diese zu löschen, so dass eine große Anzahl von Unit-Tests in einer Suite aneinandergereiht werden kann.

Antwort

2

Ich fand eine teilweise Arbeit um. In meinem Fall wurde die überwiegende Mehrheit der InvocationImpl Instanzen während eines einzelnen Testfalls erstellt, der spy() verwendet, um einen Real Partial Mock zu erstellen, sodass eine Methode überschrieben werden konnte. Ich verwende Mockito 1.10.19, also habe ich die partielle Scheinkonstruktion von spy() auf mock(<class>, withSettings().spiedInstance(realInstance).defaultAnswer(CALLS_READ_MATHODS).stubOnly()) umgestellt.

Während diese Verwendung von verify() auf dieser mock verhindert, hält die stubOnly() die Mock aus Instanzen von InvocationImpl für jeden Aufruf des Spion während der Prüfung zu speichern und signifikant verringert Haufen Verwendung.

Da meine Mocks normalerweise mit Springockito in Spring-Kontextdateien erstellt werden, brauchte ich eine hässliche Nacharbeit der Bean-Definition, um den mock()-Aufruf wie folgt zu entsprechen. Dies ermöglicht es jedoch, den Spion in Spring-verdrahteten Domänenklassen zu verwenden.

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