Maison > Java > javaDidacticiel > Comment se moquer de l'invocation de la méthode Superclass dans une classe enfant ?

Comment se moquer de l'invocation de la méthode Superclass dans une classe enfant ?

Mary-Kate Olsen
Libérer: 2024-11-04 05:51:01
original
380 Les gens l'ont consulté

How to Mock Superclass Method Invocation in a Child Class?

Se moquer de l'invocation de méthode de superclasse dans une classe enfant

Dans les tests unitaires, il est parfois nécessaire de se moquer d'un appel de méthode au sein d'une sous-classe tout en quittant le comportement original intact dans la superclasse. Ce scénario peut survenir lors du test de méthodes qui délèguent aux classes parents.

Considérons l'exemple suivant :

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

public Childservice extends BaseService {
    public void save(){
        //some code
        super.save();
    }
}</code>
Copier après la connexion

Dans ce cas, un test nécessite de se moquer uniquement de l'appel à super.save() dans la méthode ChildService tout en conservant le comportement d'origine de la méthode save() dans la classe BaseService.

Une approche pour y parvenir consiste à utiliser la fonctionnalité d'espionnage fournie par Mockito. En espionnant l'instance ChildService, il est possible d'accéder à l'instance BaseService, ce qui permet un contrôle précis sur l'appel de méthode :

<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>
Copier après la connexion

En se moquant de la méthode validate() dans la classe BaseService, le test garantit que la logique originale dans super.save() n'est pas exécutée. De plus, le remplacement de la méthode load() dans la classe ChildService vérifie qu'elle est appelée comme prévu. Cette approche fournit un contrôle précis sur les invocations de méthodes et permet d'isoler des fonctionnalités spécifiques pendant les tests.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal