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
Mary-Kate Olsenoriginal
2024-11-04 05:51:01345parcourir

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>

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>

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