Heim  >  Artikel  >  Java  >  Wie kann der Aufruf einer Superklassenmethode in einer untergeordneten Klasse simuliert werden?

Wie kann der Aufruf einer Superklassenmethode in einer untergeordneten Klasse simuliert werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 05:51:01254Durchsuche

How to Mock Superclass Method Invocation in a Child Class?

Verspotten von Methodenaufrufen von Superklassen in untergeordneten Klassen

Bei Unit-Tests ist es manchmal notwendig, einen Methodenaufruf innerhalb einer Unterklasse zu verspotten, während die Unterklasse verlassen wird ursprüngliches Verhalten in der Superklasse intakt. Dieses Szenario kann auftreten, wenn Methoden getestet werden, die an übergeordnete Klassen delegieren.

Betrachten Sie das folgende Beispiel:

<code class="java">class BaseService {
    public void save() {...}
}

public Childservice extends BaseService {
    public void save(){
        //some code
        super.save();
    }
}</code>

In diesem Fall erfordert ein Test nur das Verspotten des Aufrufs von super.save() in der ChildService-Methode unter Beibehaltung des ursprünglichen Verhaltens der save()-Methode in der BaseService-Klasse.

Ein Ansatz, dies zu erreichen, ist die Verwendung der von Mockito bereitgestellten Spionagefunktionalität. Durch das Ausspionieren der ChildService-Instanz ist der Zugriff auf die BaseService-Instanz möglich, was eine differenzierte Kontrolle über den Methodenaufruf ermöglicht:

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

Durch das Verspotten der „validate()“-Methode in der BaseService-Klasse stellt der Test dies sicher Die ursprüngliche Logik in super.save() wird nicht ausgeführt. Darüber hinaus wird durch Stubbing der Methode „load()“ in der Klasse „ChildService“ überprüft, ob sie wie erwartet aufgerufen wird. Dieser Ansatz bietet eine differenzierte Kontrolle über Methodenaufrufe und ermöglicht die Isolierung spezifischer Funktionen während des Tests.

Das obige ist der detaillierte Inhalt vonWie kann der Aufruf einer Superklassenmethode in einer untergeordneten Klasse simuliert werden?. 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