[Java] Passer des arguments au constructeur dans Mockito / Définir l'appel par défaut à la méthode à callRealMethod

Un petit mot de Mockito

Passer des arguments au constructeur


package jp.jig.product.live.server.common.service;

import org.junit.Test;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class ApiServiceTest {

    public static class ApiService {

        private final String endpoint;
        private final int timeout;

        public ApiService(String endpoint, int timeout) {
            this.endpoint = endpoint;
            this.timeout = timeout;
        }

        public String request() {
            if (endpoint == null) {
                throw new IllegalStateException("endpoint is null");
            }

            return endpoint;
        }

        public boolean validTimeout() {
            return timeout > 0;
        }
    }

    @Test
    public void test() {

        ApiService apiService = mock(ApiService.class);
        when(apiService.request()).thenCallRealMethod();
        apiService.request(); // -> throw IllegalStateException
    }

}

Par exemple, lors de la création d'une maquette de ʻApiServicecomme indiqué ci-dessus et de l'appel de la méthoderequest ()`. Je pense qu'il existe des situations où vous souhaitez définir une valeur dans le constructeur.

À ce stade, vous pouvez passer l'argument au constructeur lors de la création d'un objet fictif en utilisant MockSetting # useConstructor comme deuxième argument de mock ().


    @Test
    public void test() {
        ApiService apiService = mock(ApiService.class, withSettings().useConstructor("http://localhost", 100));
        when(apiService.request()).thenCallRealMethod();
        apiService.request(); // -> http://localhost
    }

Si vous essayez de mettre la journalisation dans le constructeur, le journal sera également sorti, vous pouvez donc voir que le traitement dans le constructeur est également en cours d'exécution.

Faire l'appel par défaut callRealMethod

Je veux essentiellement appeler la méthode originale lors du test, mais je ne veux me moquer que de certaines méthodes. .. .. Je pense qu'il y a quelque chose comme ça.

ApiService apiService = mock(ApiService.class,
 withSettings().defaultAnswer(CALLS_REAL_METHODS));

Cette valeur par défaut est callRealMethod en passant CALLS_REAL_METHODS à MockSetting # defaultAnswer.

Cependant, il y a une mise en garde, vous devez être prudent lorsque vous utilisez when () dans une méthode qui est callRealMethod.

    @Test
    public void test() {
        ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
        when(apiService.request()).thenReturn("hogehoge"); // -> throw IllegalStateException
    }

Le code ci-dessus semble fonctionner normalement, mais la méthode est appelée au moment de when (apiService.request ()). Il semble préférable d'utiliser doReturn pour éviter cela.


    @Test
    public void test() {
        ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
        doReturn("hogehoge").when(apiService).request();

        apiService.request(); // -> hogehoge
    }

Vous pouvez utiliser doReturn pour définir la simulation sans appeler callRealMethod.

Recommended Posts

[Java] Passer des arguments au constructeur dans Mockito / Définir l'appel par défaut à la méthode à callRealMethod
Résumé de la mise en œuvre des arguments par défaut en Java
Appelez la super méthode en Java
Appel de méthodes Java à partir de JavaScript exécutées en Java
[Android] Appeler la méthode d'argument par défaut de Kotlin depuis Java
Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
Vérifier les arguments d'appel de méthode dans les blocs avec RSpec
[Java] Obtenir KFunction à partir de la méthode / du constructeur en Java [Kotlin]
[Java] Mémo de méthode d'implémentation pour définir le jeton de nom d'utilisateur WS-Security dans SOAP Stub of axis2
Une méthode d'étude pour les personnes inexpérimentées pour passer Java SE 8 Silver en un mois
Comment appeler des fonctions en bloc avec la réflexion Java
[Java] Comment omettre le constructeur privé dans Lombok
Comment se moquer d'un appel de super méthode dans PowerMock
Traitement des appels du constructeur JAVA
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment passer un objet à Mapper dans MyBatis sans passer par un argument
Un moyen simple de vérifier la liste des méthodes / champs dans Java REPL
[Android, Java] Méthode pratique pour calculer la différence en jours
Créer une méthode pour renvoyer le taux de taxe en Java
Comment appeler et utiliser l'API en Java (Spring Boot)
[Kotlin] Obtenez le constructeur / la méthode Java de KFunction et appelez-le
Comment changer les arguments dans la méthode [Java] (pour ceux qui sont confus en passant par valeur, passant par référence, passant par référence)
Comment définir des constantes Java
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Exemple de code pour appeler l'API Yahoo! Local Search en Java