So testen Sie eine private Methode und verspotten sie teilweise in Java

Überblick

Als ich einen Test mit Spring Boot schrieb, wusste ich nicht, wie man die private Methode testet und wie man die private Methode verspottet, also werde ich es zusammenfassen. Es scheint, dass Sie die private Methode nicht nur mit Mockito verspotten können, sondern PowerMock zusammen verwenden.

Umgebung

Getestete Klasse

Bereiten Sie eine Klasse vor, die entsprechend getestet werden soll. Sei es die "HelloService" -Klasse.

import org.springframework.beans.factory.annotation.Autowired;

public class HelloService {

    @Autowired
    private HelloRepository repository;

    public String getFromRepo() {
        return repository.getData();
    }

    public String methodPublic(String arg) {
        return "method public: " + methodPrivate(arg);
    }

    private String methodPrivate(String arg) {
        return "method private, arg: " + arg;
    }
}

Erstellen Sie eine Klasse, von der die HelloService-Klasse abhängt.

public class HelloRepository {

    public String getData() {
        return "HelloRepository.getData";
    }
}

Kommentar

Private Methoden testen

Hier wird die Testmethode der Methode methodPrivate erläutert, bei der es sich um eine private Methode der oben genannten Testzielklasse HelloService handelt.

Versuchen

import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Method;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public class HelloServiceTest {

    private HelloService service;

    @Before
    public void setUp() {
        service = new HelloService();
    }

    @Test
Öffentliche Leermethode Privater Test() throws Exception {
        Method method = HelloService.class.getDeclaredMethod("methodPrivate", String.class);
        method.setAccessible(true);
        String actual = (String)method.invoke(service, "hoge");
        assertThat(actual, is("method private, arg: hoge"));
    }
}

Kommentar

Teilweise verspotten Sie eine private Methode

Hier wird erklärt, wie die oben aufgerufene private Methode methodPrivate teilweise verspottet wird, wenn die methodPublic -Methode der Testzielklasse HelloService getestet wird.

Versuchen

Da PowerMock verwendet wird, fügen Sie build.gradle Folgendes hinzu (Wenn Sie maven verwenden, lesen Sie dies bitte entsprechend).

dependencies {
    testCompile('org.powermock:powermock-module-junit4:1.6.2')
    testCompile('org.powermock:powermock-api-mockito:1.7.3')
}

Schreiben Sie einen Test

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.lang.reflect.Method;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.spy;

@RunWith(PowerMockRunner.class)
@PrepareForTest(HelloService.class)
public class HelloServiceTest {

    private HelloService service;

    @Before
    public void setUp() {
        service = spy(new HelloService());
    }

    @Test
Öffentliche Leermethode Öffentlicher Test() throws Exception {
        when(service, "methodPrivate", "fuga").thenReturn("hoge");
        String actual = service.methodPublic("fuga");
        verifyPrivate(service, times(1)).invoke("methodPrivate", "fuga");

        assertThat(actual, is("method public: " + "hoge"));
    }
}

Kommentar

Wird mit Mockito Mock verwendet

Fügen Sie einen Test für die Methode "getFromRepo" hinzu.

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.spy;

@RunWith(PowerMockRunner.class)
@PrepareForTest(HelloService.class)
public class HelloServiceTest {

    @Mock
    private HelloRepository repository;

    @InjectMocks
    private HelloService service;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        service = spy(service);
    }

    @Test
Öffentlicher nichtiger getFromRepo-Test() {
        when(repository.getData()).thenReturn("hoge");
        assertThat(service.getFromRepo(), is("hoge"));

        verify(service, times(1)).getFromRepo();
    }

    @Test
Öffentliche Leermethode Öffentlicher Test() throws Exception { //Das gleiche wie oben}

    @Test
Öffentliche Leermethode Privater Test() throws Exception { //Das gleiche wie oben}
}

Kommentar

Impressionen

PowerMock war praktisch. Ich habe Mockito verwendet, um nicht-private Methoden zu verspotten (in diesem Fall Hello Repository-ähnliche), und ich dachte, es wäre praktisch für @ Mock oder @ InjectMocks. Als ich versuchte, eine private Methode mit PowerMock zu verspotten, dachte ich, es wäre verwirrend, wenn sich die Methode drastisch ändern würde, aber ich bin erleichtert, dass ich sie auf die gleiche Weise schreiben kann.

Referenz

Recommended Posts

So testen Sie eine private Methode und verspotten sie teilweise in Java
So verspotten Sie einen Super-Methodenaufruf in PowerMock
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So entwickeln und registrieren Sie eine Sota-App in Java
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet
So zeigen Sie eine Webseite in Java an
So greifen Sie auf Java Private-Methoden und -Felder zu
So erstellen Sie eine bequeme Methode, die Generika und eine funktionale Schnittstelle verwendet
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
So erstellen Sie einen Daten-URI (base64) in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
So erstellen Sie eine Methode
Speichern von Zeichenfolgen von ArrayList zu Zeichenfolge in Java (Personal)
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Aufrufen und Verwenden der API in Java (Spring Boot)
So simulieren Sie das Hochladen von Post-Object-Formularen in OSS in Java
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
So erstellen Sie einen Java-Container
[Java] Verwendung der Join-Methode
Wie man JAVA in 7 Tagen lernt
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So erstellen Sie ein Java-Array
So verketten Sie Zeichenfolgen mit Java
Wie POST JSON in Java-Methode mit OkHttp3 und Methode mit HttpUrlConnection-
So erstellen Sie ein neues Gradle + Java + Jar-Projekt in Intellij 2016.03
So bedienen Sie automatisch einen in Java unter Windows erstellten Bildschirm
Speichern der im Textbereich eingegebenen Informationen in einer Variablen in der Methode
[Wire Mock] Ich möchte einen Stub / Mock-Server in Java einrichten und E2E-Tests durchführen.
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)
So erstellen Sie ein Schlüsselpaar von ecdsa in einem Format, das von Java gelesen werden kann
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
So erstellen Sie eine Java-Kalenderzusammenfassung
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
So filtern Sie den JUnit-Test in Gradle
So fügen Sie ein Video in Rails ein
Verwendung der Submit-Methode (Java Silver)
So führen Sie eine Basiskonvertierung in Java durch
[Einführung in Java] So schreiben Sie ein Java-Programm
[Java] Verwendung der toString () -Methode
Wie man Parameter in der link_to-Methode hat
[Java] Wie man Dateien ausgibt und schreibt!
Wie erstelle ich einen Discord Bot (Java)
So erzwingen Sie Codierungskonventionen in Java
Einbetten von Janus Graph in Java
So erhalten Sie das Datum mit Java
So testen Sie den privaten Bereich mit JUnit
So veröffentlichen Sie eine Bibliothek in jCenter
[SpringBoot] So schreiben Sie einen Controller-Test
Von Java nach C und von C nach Java in Android Studio