Comment faire un test unitaire Java (JUnit & Mockito & PowerMock)

C'est un résumé pour moi. Décrit comment créer un test unitaire Java à l'aide de la bibliothèque suivante. --JUnit (cadre de test) --Mockito (cadre de création Mock) --PowerMock (cadre d'extension Mockito)

Paramètres Gradle

J'ai utilisé Gradle pour télécharger les fichiers nécessaires (JUnit, Mockito, PowerMock). Le contenu du fichier de paramètres est le suivant.

build.gradle


apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    testCompile 'junit:junit:4.12'
    testCompile "org.mockito:mockito-core:2.+"
    testCompile 'org.powermock:powermock-module-junit4:2.0.0-RC.4'
    testCompile 'org.powermock:powermock-api-mockito2:2.0.0-RC.4'
}

Classe testée

C'est la classe à tester. Envisagez d'utiliser JUnit, Mockito et PowerMock pour cette classe.

Samole.java


public class Sample {
    private Sub sub;

    public Sample() {}

    public Sample(Sub sub) {
        this.sub = sub;
    }

    public String pubGet() {
        return "pubGet";
    }

    public String pubGet(String suffix) {
        return pubGet() + suffix;
    }

    public String pubGetSubValue() {
        return sub.getValue();
    }

    public String pubGetStaticValue() {
        return Static.getValue();
    }

    private String priGet() {
        return "priGet";
    }

    private String priGet(String suffix) {
        return priGet() + suffix;
    }

    public static class Sub {
        private String value;
        public Sub(String value) {
            this.value = value;
        }
        public String getValue() {
            return value;
        }
    }

    public static class Static {
        public static String getValue() {
            return "Static value";
        }
    }
}

Classe de test JUnit uniquement

Lorsque vous utilisez uniquement JUnit.

SampleTest.java


import org.junit.Before;
import org.junit.Test;

import java.lang.reflect.Method;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;

public class SampleTest {
    private Sample instance;
    @Before
    public void init() {
        this.instance = new Sample();
    }
    @Test
    public void pubGet() {
        //Test de méthode publique
        String actual = instance.pubGet();
        assertThat(actual, is("pubGet"));
    }
    @Test
    public void priGet() throws Exception {
        //Test de méthode privée (sans arguments)
        Method method = Sample.class.getDeclaredMethod("priGet");
        method.setAccessible(true);

        String actual = (String) method.invoke(instance);
        assertThat(actual, is("priGet"));
    }
    @Test
    public void priGet_withArg() throws Exception {
        //Test de méthode privée (avec arguments)
        Method method = Sample.class.getDeclaredMethod("priGet", String.class);
        method.setAccessible(true);

        String actual = (String) method.invoke(instance, "Suffix");
        assertThat(actual, is("priGetSuffix"));
    }
    @Test
    public void pubGetSubValue() {
        Sample instance = new Sample(new Sample.Sub("test"));

        String actual = instance.pubGetSubValue();
        assertThat(actual, is("test"));
    }

}

Classe de test avec JUnit & Mockito

Lorsque Mockito est ajouté. Vous pouvez réécrire le contenu de la méthode à l'aide d'un simulacre.

SampleForMockitoTest.java


import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;

import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class SampleForMockitoTest {
    @Mock
    private Sample mock;
    @Spy
    private Sample spy;
    @Before
    public void init() {
        // @Initialiser l'objet fictif de l'annotation fictive
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void pubGetSubValue() {
        //Lorsque vous n'utilisez pas de maquette
        Sample instance = new Sample(new Sample.Sub("test"));

        String actual = instance.pubGetSubValue();
        assertThat(actual, is("test"));
    }
    @Test
    public void pubGetSubValue_withMockito() {
        //Renvoie la valeur du stub lors de l'utilisation d'un simulacre
        Sample.Sub mock = mock(Sample.Sub.class);
        when(mock.getValue()).thenReturn("mock value");
        Sample instance = new Sample(mock);

        String actual = instance.pubGetSubValue();
        assertThat(actual, is("mock value"));
    }

    @Test
    public void pubGetSubValue_withMockitoMock() {
        // mock()Sera la valeur par défaut (null) si le stub n'est pas implémenté
        String actual1 = mock.pubGet();
        assertThat(actual1, is(nullValue()));

        // mock()Renvoie la valeur du stub lors de l'implémentation du stub
        when(mock.pubGet()).thenReturn("mock value");
        String actual2 = mock.pubGet();
        assertThat(actual2, is("mock value"));
    }

    @Test
    public void pubGetSubValue_withMockitoSpy() {
        // spy()Renvoie la valeur réelle sans implémenter le stub
        String actual1 = spy.pubGet();
        assertThat(actual1, is("pubGet"));

        // spy()Renvoie la valeur du stub lors de l'implémentation du stub
        when(spy.pubGet()).thenReturn("mock value");
        String actual2 = spy.pubGet();
        assertThat(actual2, is("mock value"));
    }
    @Test
    public void pubGetSubValue_withMockitoAnswer() {
        // mock()Renvoie la valeur du stub lors de l'implémentation du stub
        //Answer vous permet d'utiliser des arguments de méthode pour les stubs
        when(mock.pubGet(anyString())).thenAnswer(invocation -> {
            String arg1 = (String) invocation.getArguments()[0];
            return "mock value " + arg1;
        });
        String actual = mock.pubGet("suffix");
        assertThat(actual, is("mock value suffix"));
    }
}

Classe de test avec JUnit, Mockito et PowerMock

Lorsque PowerMock est ajouté. Vous pouvez réécrire le contenu de la méthode static.

SamleForPowerMockTest.java


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 static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Sample.Static.class})
public class SamleForPowerMockTest {
    private Sample instance;
    @Before
    public void init() {
        instance = new Sample();
    }
    @Test
    public void pubGetWithStatic() {
        //Tester la valeur de la méthode statique
        String actual = instance.pubGetStaticValue();
        assertThat(actual, is("Static value"));
    }
    @Test
    public void pubGetWithStatic_withPowerMock() {
        // mockStatic()La méthode statique renvoie la valeur de stub dans
        PowerMockito.mockStatic(Sample.Static.class);
        //Si vous souhaitez que le comportement d'origine soit différent de la méthode souhaitée, utilisez plutôt PowerMockito.spy()utilisation
        // PowerMockito.spy(Sample.Static.class); 
        PowerMockito.when(Sample.Static.getValue()).thenReturn("PowerMockito value");

        String actual = instance.pubGetStaticValue();
        assertThat(actual, is("PowerMockito value"));
    }
}

Résumé

PowerMock permet une réécriture puissante. Cependant, si vous comptez trop sur PowerMock, vous perdez de vue son objectif initial (implémentation extensible). J'ai également ressenti le danger d'être un test qui n'a fait que gagner en couverture, il semble donc préférable de réfléchir à où l'utiliser.

Remarques

J'ai fait référence à Utilisation correcte de Mockito et PowerMock.

Recommended Posts

Comment faire un test unitaire Java (JUnit & Mockito & PowerMock)
Java - Comment créer JTable
Test unitaire Java avec Mockito
Comment créer un conteneur Java
Comment créer un tableau Java
Comment créer un résumé de calendrier Java
Comment créer un robot Discord (Java)
[Java] Comment tester s'il est nul dans JUnit
[Rails] Comment implémenter un test unitaire d'un modèle
[Java] Comment rendre plusieurs boucles for uniques
Comment faire un pot ombré
Comment écrire Mockito
Comment abaisser la version java
[Java] Comment utiliser Map
Comment désinstaller Java 8 (Mac)
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment réduire les images Java
Comment rédiger un commentaire java
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
[Java] Comment afficher les Wingdings
Comment utiliser Java Map
Comment définir des constantes Java
Comment écrire Junit 5 organisé
Comment utiliser les variables Java
Comment convertir la base Java
[Rails] Comment faire des graines
[Java] Comment implémenter le multithreading
Comment initialiser un tableau Java
[Création] Comment utiliser JUnit
Utilisez Spring Test + Mockito + JUnit 4 pour le test unitaire Spring Boot + Spring Retry
Comment étudier Java Silver SE 8
Comment utiliser HttpClient de Java (Get)
Comment faire un test unitaire de Spring AOP
Comment exécuter JUnit dans Eclipse
Étudier Java # 6 (Comment écrire des blocs)
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
Comment créer un pilote JDBC
Comment apprendre JAVA en 7 jours
Comment créer le module personnalisé de l'API JAVA de Wowza Streaming Engine (préparation)
[Traitement × Java] Comment utiliser les variables
Comment décompiler un fichier de classe Java
[JavaFX] [Java8] Comment utiliser GridPane
Comment écrire une déclaration de variable Java
Présentation des conseils Java de GreenMail à Junit5
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?