[JAVA] Test de la logique d'envoi et de réception de demande avec MockWebServer dans JUnit

J'ai eu l'opportunité d'implémenter une fonction en utilisant une API externe dans une application Java, alors parlez de cette époque.

Chose que tu veux faire

Si vous implémentez nouvellement le traitement de transmission / réception de demande, vous voudrez vérifier si l'opération attendue est effectuée avec une réponse fixe. J'ai donc décidé d'utiliser une bibliothèque appelée MockWebServer pour renvoyer une réponse fixe. Cela simplifie la vérification logique de la partie d'envoi et de réception de la demande.

mockserver.png

Environnement de développement

L'environnement Java à essayer cette fois est le suivant.

$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

On suppose que l'outil de construction utilise maven (3.6.0).

Comment utiliser

Ajoutez la bibliothèque requise à pom.xml.

<dependency>
  <groupId>com.squareup.okhttp</groupId>
  <artifactId>mockwebserver</artifactId>
  <version>2.7.5</version>
  <scope>test</scope>
</dependency>

Vous devez importer MockWebServer et MockResponse pour l'implémenter.

MockWebServer est une classe qui fournit un mécanisme pour recevoir une demande et renvoyer une réponse, et MockResponse est une classe utilisée pour définir un contenu de réponse dédié.

Au minimum, l'implémentation suivante est requise pour exécuter MockWebServer.

import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class QiitaTest {
    
    private MockWebServer mockWebServer;
    
    @Before
    public void setup() throws IOException {
        this.mockWebServer = new MockWebServer();
        this.mockWebServer.start();
    }

    @Test
    public void qiitaTest() {
        String json = "{\"message\": \"Test de qiita\"}";
        MockResponse mockResponse = new MockResponse();
        mockResponse.setBody(json);
        mockResponse.setResponseCode(200);
        this.mockWebServer.enqueue(mockResponse);
        
        String mockServerUrl = mockWebServer.url("/").toString();
        // mockServerUrl = http://localhost:59690/
        
        //Rédiger le processus de transmission de la demande, recevoir la réponse et écrire le contenu du test
    }
}

Pour démarrer un serveur factice, créez une instance de MockWebServer et appelez la méthode start. Bien que non utilisé ici, il est possible de spécifier un port comme argument du constructeur. Comme mockWebServer.start () a IOException spécifié dans throws, setup () défini comme prétraitement fait de même.

Cela permet de vérifier le processus de mappage du contenu de la réponse à un objet utilisant Jackson etc. avec une réponse fixe.

Vous pouvez essayer le traitement normal comme décrit ci-dessus, mais vous pouvez utiliser setBodyDelay pour retarder arbitrairement la réponse.

import import java.util.concurrent.TimeUnit;
...
    @Test
    public void qiitaDelayTest() {
        String json = "{\"message\": \"10 secondes de retard\"}";
        MockResponse mockResponse = new MockResponse();
        mockResponse.setBody(json);
        mockResponse.setBodyDelay(10, TimeUnit.SECONDS);
        mockResponse.setResponseCode(200);
        this.mockWebServer.enqueue(mockResponse);
        ...        
    }

Vous pouvez définir un délai dans le processus de transmission de la demande et essayer la gestion des erreurs lorsque le seuil est volontairement dépassé.

Dans le test unitaire, le test est exécuté en créant explicitement json comme celui-ci et en envoyant la demande, mais avec MockServer démarré en arrière-plan, exécutez l'application qui dirige la demande vers MockServer. , Il est également possible de vérifier le fonctionnement.

finalement

Grâce à MockWebServer, j'ai pu vérifier facilement l'opération en spécifiant la réponse. Comme le code de test lui-même n'était pas familier, il peut y avoir des erreurs, mais c'était la méthode lorsque j'ai vérifié le fonctionnement de la logique via l'API externe.

Recommended Posts

Test de la logique d'envoi et de réception de demande avec MockWebServer dans JUnit
Introduction au test de paramétrage dans JUnit
Exemple de code pour la simulation de base et les tests avec Mockito 3 + JUnit 5
Démarrez les tests d'interface utilisateur avec Dagger2 et Mockito
Contrôler l'ordre de test dans Junit4 avec un type d'énumération