Maison >Java >javaDidacticiel >Comment se moquer partiellement des méthodes dans Mockito : se moquer de méthodes spécifiques tout en préservant les autres ?

Comment se moquer partiellement des méthodes dans Mockito : se moquer de méthodes spécifiques tout en préservant les autres ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-05 13:26:11757parcourir

How to Partially Mock Methods in Mockito: Mocking Specific Methods While Preserving Others?

Moquerie partielle : moquerie de méthodes spécifiques dans Mockito

Lors du test d'une classe, il peut être nécessaire de se moquer uniquement de certaines méthodes tout en préservant le comportement des autres. Dans Mockito, cela est réalisé grâce à une « moquerie partielle », où une sélection de méthodes est simulée tandis que celles non simulées s'exécutent comme prévu.

Considérez la classe Stock suivante avec getPrice(), getQuantity() et getValue( ) méthodes :

public class Stock {
    ...
    public double getValue() {
        return getPrice() * getQuantity();
    }
}

Dans un cas de test, si nous souhaitons nous moquer des méthodes getPrice() et getQuantity() mais laisser getValue() s'exécuter normalement, nous pouvons définir une simulation partielle comme suit :

Stock stock = mock(Stock.class);
when(stock.getPrice()).thenReturn(100.00);
when(stock.getQuantity()).thenReturn(200);
when(stock.getValue()).thenCallRealMethod();

Ici, les méthodes getPrice() et getQuantity() ont des implémentations simulées, tandis que getValue() s'exécute comme dans la classe Stock d'origine.

Vous pouvez également utiliser l'API "espion":

Stock stock = spy(Stock.class);
when(stock.getPrice()).thenReturn(100.00);
when(stock.getQuantity()).thenReturn(200);

Tous les autres appels de méthode, dans ce cas getValue(), utilisent le vrai implémentation.

Pour garantir que la méthode réelle n'est pas appelée et que la logique moqueuse est appliquée de manière cohérente, considérez la notation alternative suivante :

doReturn(100.00).when(stock).getPrice();
doReturn(200).when(stock).getQuantity();

Cependant, il est important de noter que dans cet exemple, la méthode getValue() s'appuie directement sur le prix et la quantité, et non sur leurs getters. Par conséquent, se moquer de getPrice() et getQuantity() peut toujours ne pas produire le comportement souhaité.

Une approche alternative serait d'éviter complètement de se moquer et de s'appuyer plutôt sur une instanciation directe de la classe Stock :

Stock stock = new Stock(100.00, 200);
double value = stock.getValue();

En créant une instance réelle, nous pouvons garantir que getValue() s'exécute comme prévu, en nous basant sur les valeurs réelles de prix et de quantité.

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