Heim  >  Artikel  >  Java  >  Wie verspottet man Unterklassenmethoden und behält gleichzeitig Superklassenimplementierungen in Mockito bei?

Wie verspottet man Unterklassenmethoden und behält gleichzeitig Superklassenimplementierungen in Mockito bei?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 14:08:30774Durchsuche

How to Mock Subclass Methods While Preserving Superclass Implementations in Mockito?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn