[JAVA] Aide-mémoire Mockito + PowerMock

introduction

Lorsque vous vous moquez de Mockito + PowerMock dans un test unitaire Java, essayez de résumer ceux que vous êtes susceptible d'utiliser aussi brièvement que possible. (Je prévois de l'ajouter au besoin)

table des matières

Présentez Mockito et PowerMock

Pour Gradle, ajoutez la dépendance suivante à build.gradle.

build.gradle


dependencies {
    testImplementation 'junit:junit:4.12'
    testImplementation "org.mockito:mockito-core:2.28.+"
    testImplementation 'org.powermock:powermock-module-junit4:2.0.2'
    testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'
}

Méthodes statiques simulées

Simulons la méthode statique "ExampleDBA.findAll ()" appelée depuis la méthode lors du test de la méthode suivante.

Classe testée


import java.util.List;

public class ExampleLogic {
    public Integer countExamples() {
        List<ExampleDTO> list = ExampleDBA.findAll();
        return list.size();
    }
}

Classe d'essai


import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.powermock.api.mockito.PowerMockito.when;

import java.util.Arrays;
import java.util.List;

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;

@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest({ ExampleDBA.class }) //(2)
public class ExampleLogicTest {

    ExampleLogic logic = new ExampleLogic();

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(ExampleDBA.class); //(3)
    }

    @Test
    public void countExamples() {
        List<ExampleDTO> result = Arrays.asList(new ExampleDTO());
        when(ExampleDBA.findAll()).thenReturn(result); //(4)
        assertThat(logic.countExamples(), equalTo(1));
    }
}

(1) C'est une magie nécessaire lors de l'utilisation de PowerMock. (2) Spécifiez une classe qui a une méthode statique à simuler. (3) Spécifiez une classe qui a une méthode statique à simuler. (4) Spécifiez la valeur de retour lorsque la méthode statique est exécutée.

Simulez une nouvelle instance

Classe testée


public class ExampleService {
    public Integer count() {
        ExampleLogic logic = new ExampleLogic();
        return logic.countExamples();
    }
}

Classe d'essai


import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.whenNew;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest({ ExampleService.class }) //(2)
public class ExampleServiceTest {

    ExampleService service = new ExampleService(); //(3)

    @Test
    public void count() throws Exception {
        ExampleLogic logic = mock(ExampleLogic.class); //(4)
        whenNew(ExampleLogic.class).withNoArguments().thenReturn(logic); //(5)
        when(logic.countExamples()).thenReturn(0); //(6)

        assertThat(service.count(), equalTo(0));
    }
}

(1) C'est une magie nécessaire lors de l'utilisation de PowerMock. (2) Spécifiez la classe à tester. (3) Créez une instance de la classe à tester. (4) Créez un objet simulé. (5) Défini pour renvoyer un objet simulé lorsqu'il est neuf. (6) Définissez la valeur de retour lorsque la méthode de l'objet fictif est appelée. (*) Il faut exécuter (4) à (6) avant de renouveler l'objet à moquer. Par exemple, si vous créez un nouveau ExampleLogic dans le constructeur de ExampleService ExampleService doit être (3) après (6).

Mock quelques méthodes

Classe testée


public class ExampleLogic2 {
    private String privateMethod() {
        return "abc";
    }
    public String publicMethod() {
        String str = privateMethod();
        return str.toUpperCase();
    }
}

Classe d'essai


import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest(ExampleLogic2.class) //(2)
public class ExampleLogicTest2 {

    @Test
    public void publicMethod() throws Exception {
        ExampleLogic2 logic = spy(new ExampleLogic2()); //(3)
        when(logic, "privateMethod").thenReturn("str"); //(4)
        assertThat(logic.publicMethod(), equalTo("STR"));
    }
}

(1) C'est une magie nécessaire lors de l'utilisation de PowerMock. (2) Spécifiez la classe à tester. (3) Afin de se moquer de certaines méthodes, créez une nouvelle classe cible de test et appelez spy. (4) Définissez la valeur de retour de la méthode à simuler (privée dans cet exemple).

Recommended Posts

Aide-mémoire Mockito + PowerMock
Aide-mémoire Java
Aide-mémoire JMeter
Aide-mémoire de Kotlin
[Aide-mémoire Docker]
Fiche technique des collections Eclipse
Fiche technique du didacticiel Rails
Aide-mémoire Spring Boot2
Aide-mémoire pour la notation SCSS
Aide-mémoire de la commande Docker
Aide-mémoire de l'API Java Stream
[Eclipse] Aide-mémoire sur les touches de raccourci
Aide-mémoire C # pour les techniciens Java
Aide-mémoire privé pour la programmation compétitive (Java)
javac, jar, feuille de triche de commande java
Utilisation correcte de Mockito et PowerMock
Technologie de lecture du code source (cheet sheet)
[Java] Aide-mémoire de classe de type de données / chaîne de caractères
Aide-mémoire de base par langue (Ruby, PHP)