Comment tester une méthode privée et la simuler partiellement en Java

Aperçu

Quand j'ai écrit un test avec Spring Boot, je ne savais pas comment tester la méthode privée et comment se moquer de la méthode privée, je vais donc le résumer. Il semble que vous ne pouvez pas vous moquer de la méthode privée avec Mockito seul, alors utilisez PowerMock ensemble.

environnement

Classe testée

Préparez une classe à tester de manière appropriée. Que ce soit la classe HelloService.

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;
    }
}

Créez une classe dont dépend la classe HelloService.

public class HelloRepository {

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

Commentaire

Tester des méthodes privées

Ici, la méthode de test de la méthode methodPrivate, qui est une méthode privée de la classe HelloService de la classe cible de test mentionnée ci-dessus, sera expliquée.

Essayer

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
Méthode du vide public Test privé() 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"));
    }
}

Commentaire

Simulation partielle d'une méthode privée

Ici, nous allons expliquer comment se moquer partiellement de la méthode privée methodPrivate appelée ci-dessus lors du test de la méthode methodPublic de la classe cible de test HelloService.

Essayer

Puisque PowerMock est utilisé, ajoutez ce qui suit à build.gradle (Si vous utilisez maven, veuillez lire comme il convient)

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

Ecrire un 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
Méthode publique void Test public() 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"));
    }
}

Commentaire

Utilisé avec la maquette Mockito

Ajoutez un test pour la méthode getFromRepo.

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
Test public void getFromRepo() {
        when(repository.getData()).thenReturn("hoge");
        assertThat(service.getFromRepo(), is("hoge"));

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

    @Test
Méthode publique void Test public() throws Exception { //Comme ci-dessus}

    @Test
Méthode du vide public Test privé() throws Exception { //Comme ci-dessus}
}

Commentaire

--Mocking du Hello Repository dépendant. --Annotez le champ que vous voulez simuler avec @ Mock et annotez le champ que vous voulez simuler avec @ InjectMocks --Si vous appelez MockitoAnnotations.initMocks (this); dans setUp (), il semble qu'il injectera un simulacre. `` J'étais inquiet s'il coexisterait avec le PowerMock ci-dessus, mais cela fonctionnait bien si je faisais simplement service = spy (service); après initMocks.

Impressions

PowerMock était pratique. Lors de la moquerie d'une méthode non privée (Hello Repository dans ce cas), j'ai utilisé Mockito, et j'ai pensé que ce serait pratique pour @ Mock ou @ InjectMocks. Quand j'ai essayé d'utiliser PowerMock pour simuler une méthode privée, j'ai pensé que ce serait déroutant si la méthode changeait radicalement, mais je suis soulagé de pouvoir l'écrire de la même manière.

référence

Recommended Posts

Comment tester une méthode privée et la simuler partiellement en Java
Comment se moquer d'un appel de super méthode dans PowerMock
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment développer et enregistrer une application Sota en Java
Comment implémenter un travail qui utilise l'API Java dans JobScheduler
Comment afficher une page Web en Java
Comment accéder aux méthodes et champs Java Private
Comment créer une méthode pratique qui utilise des génériques et une interface fonctionnelle
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
Comment créer un environnement Java en seulement 3 secondes
[Java] Comment omettre le constructeur privé dans Lombok
Comment créer un URI de données (base64) en Java
Comment convertir un fichier en tableau d'octets en Java
Comment créer une méthode
Comment stocker des chaînes de ArrayList à String en Java (personnel)
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Créer une méthode pour renvoyer le taux de taxe en Java
Comment appeler et utiliser l'API en Java (Spring Boot)
Comment simuler le téléchargement de formulaires post-objet vers OSS en Java
Différences dans la gestion des chaînes entre Java et Perl
Comment créer un conteneur Java
[Java] Comment utiliser la méthode de jointure
Comment apprendre JAVA en 7 jours
Comment initialiser par lots des tableaux avec Java que je ne savais pas quand j'étais débutant
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment créer un tableau Java
Comment concaténer des chaînes avec Java
Comment POST JSON dans la méthode Java en utilisant OkHttp3 et la méthode en utilisant HttpUrlConnection-
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03
Comment faire fonctionner automatiquement un écran créé en Java sous Windows
Comment stocker les informations saisies dans la zone de texte dans une variable de la méthode
[Wire Mock] Je souhaite configurer un serveur stub / simulé en Java et effectuer des tests E2E.
[Java] Comment rechercher des valeurs dans un tableau (ou une liste) avec la méthode contains
Comment créer une paire de clés d'ecdsa dans un format lisible par Java
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Comment créer un résumé de calendrier Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
[Java] Résumez comment comparer avec la méthode equals
Comment filtrer JUnit Test dans Gradle
Comment insérer une vidéo dans Rails
Comment utiliser la méthode de soumission (Java Silver)
Comment faire une conversion de base en Java
[Introduction à Java] Comment écrire un programme Java
[Java] Comment utiliser la méthode toString ()
Comment avoir des paramètres dans la méthode link_to
[Java] Comment sortir et écrire des fichiers!
Comment créer un robot Discord (Java)
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
Comment obtenir la date avec Java
Comment tester l'étendue privée avec JUnit
Comment publier une bibliothèque dans jCenter
[SpringBoot] Comment écrire un test de contrôleur
De Java à C et de C à Java dans Android Studio