[Java] Übergeben Sie Argumente an den Konstruktor in Mockito / Set default call to method an callRealMethod

Eine kleine Notiz von Mockito

Übergeben Sie Argumente an den Konstruktor


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
    }

}

Zum Beispiel, wenn Sie ein Modell von "ApiService" wie oben gezeigt erstellen und die Methode "request ()" aufrufen. Ich denke, es gibt Situationen, in denen Sie einen Wert im Konstruktor festlegen möchten.

Zu diesem Zeitpunkt können Sie das Argument beim Erstellen eines Scheinobjekts an den Konstruktor übergeben, indem Sie "MockSetting # useConstructor" als zweites Argument von "mock ()" verwenden.


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

Wenn Sie versuchen, die Protokollierung in den Konstruktor einzufügen, wird das Protokoll ebenfalls ausgegeben, sodass Sie sehen können, dass die Verarbeitung im Konstruktor ebenfalls ausgeführt wird.

Führen Sie den Standardaufruf callRealMethod durch

Grundsätzlich möchte ich beim Testen die ursprüngliche Methode aufrufen, aber ich möchte nur einige der Methoden verspotten. .. .. Ich denke, da ist so etwas.

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

Dies ist standardmäßig callRealMethod, indem CALLS_REAL_METHODS an MockSetting # defaultAnswer übergeben wird.

Es gibt jedoch eine Einschränkung: Sie müssen vorsichtig sein, wenn Sie "when ()" in einer Methode namens callRealMethod verwenden.

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

Der obige Code scheint normal zu funktionieren, aber die Methode wird zum Zeitpunkt von "when (apiService.request ())" aufgerufen. Es scheint besser, "doReturn" zu verwenden, um dies zu vermeiden.


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

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

Sie können doReturn verwenden, um den Mock festzulegen, ohne callRealMethod aufzurufen.

Recommended Posts

[Java] Übergeben Sie Argumente an den Konstruktor in Mockito / Set default call to method an callRealMethod
Zusammenfassung der Implementierung von Standardargumenten in Java
Rufen Sie die Super-Methode in Java auf
Rufen Sie Java-Methoden aus JavaScript auf, das in Java ausgeführt wird
[Android] Rufen Sie Kotlins Standardargumentmethode von Java aus auf
Java-Methodenaufruf von RPG (Methodenaufruf in eigener Klasse)
Überprüfen Sie die Argumente für Methodenaufrufe in Blöcken mit RSpec
[Java] KFunction von Method / Constructor in Java abrufen [Kotlin]
[Java] Implementierungsmethoden-Memo zum Festlegen des WS-Security-Benutzernamens-Tokens im SOAP-Stub von axis2
Eine Lernmethode für unerfahrene Personen, um Java SE 8 Silver in einem Monat zu bestehen
Aufrufen von Funktionen in großen Mengen mit Java Reflection
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
So verspotten Sie einen Super-Methodenaufruf in PowerMock
JAVA-Konstruktoraufrufverarbeitung
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
So übergeben Sie ein Objekt in MyBatis an Mapper, ohne ein Argument durchzugehen
Einfache Möglichkeit, die Methoden- / Feldliste in Java REPL zu überprüfen
[Android, Java] Praktische Methode zur Berechnung der Differenz in Tagen
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Aufrufen und Verwenden der API in Java (Spring Boot)
[Kotlin] Holen Sie sich Java Constructor / Method von KFunction und rufen Sie es auf
So ändern Sie das Argument in der [Java] -Methode (für diejenigen, die durch Übergabe von Werten, Übergeben von Referenzen, Übergeben von Referenzen verwirrt sind)
So legen Sie Java-Konstanten fest
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java