Heim >Java >javaLernprogramm >Wie verspottet man Unterklassenmethoden und behält gleichzeitig Superklassenimplementierungen in Mockito bei?
Unterklassenmethoden verspotten und gleichzeitig Superklassenimplementierungen beibehalten
Mockito, ein weit verbreitetes Java-Mocking-Framework, steht häufig vor der Herausforderung, bestimmte Methoden selektiv zu verspotten innerhalb von Klassenhierarchien. Dieser Artikel behandelt ein Szenario, in dem Sie nur den Aufruf einer von der Superklasse geerbten Methode verspotten möchten.
Problemstellung
Bedenken Sie die folgende Klassenstruktur:
<code class="java">class BaseService { public void save() {...} } public Childservice extends BaseService { public void save(){ //some code super.save(); } } </code>
In Unit-Tests möchten Sie möglicherweise nur den zweiten Aufruf von super.save() verspotten, ohne die Implementierung in ChildService zu beeinträchtigen.
Lösung
Während es im Allgemeinen nicht empfohlen wird, bestehende Klassenhierarchien zu Testzwecken umzugestalten, gibt es Möglichkeiten, diese Herausforderung anzugehen, ohne die Codebasis zu ändern.
Erwägen Sie den folgenden Ansatz:
<code class="java">class BaseService { public void validate(){ fail(" I must not be called"); } public void save(){ //Save method of super will still be called. validate(); } } class ChildService extends BaseService{ public void load(){} public void save(){ super.save(); load(); } } @Test public void testSave() { ChildService classToTest = Mockito.spy(new ChildService()); // Prevent/stub logic in super.save() Mockito.doNothing().when((BaseService)classToTest).validate(); // When classToTest.save(); // Then verify(classToTest).load(); }</code>
Diese Lösung nutzt Mockitos API Mockito.spy() zum Umschließen einer Instanz der ChildService-Klasse. Anschließend überschreibt es die Methode „validate()“ von BaseService (der Oberklasse) mithilfe von Mockito.doNothing(). Dadurch wird sichergestellt, dass die Logik in „validate()“ während des Tests vermieden wird. Infolgedessen wird die eigentliche Implementierung von ChildService.save() aufgerufen, während der Aufruf von super.save() effektiv blockiert wird.
Zusätzliche Hinweise
Dies Diese Technik sollte sparsam eingesetzt werden, da Stubbing oder Spotting externer Methoden zu fragilen Tests führen und die Genauigkeit Ihrer Testergebnisse beeinträchtigen kann. Es kann jedoch eine pragmatische Lösung sein, wenn eine Umgestaltung der Klassenhierarchie keine Option ist.
Das obige ist der detaillierte Inhalt vonWie verspottet man Unterklassenmethoden und behält gleichzeitig Superklassenimplementierungen in Mockito bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!