Introduction à MockServer

Introduction à MockServer

1. Vue d'ensemble

MockServer est un outil de simulation / stubbing d'API HTTP externes.

2. Dépendances Maven

Pour utiliserMockServer dans notre application, nous devons ajouter deux dépendances:


    org.mock-server
    mockserver-netty
    3.10.8


    org.mock-server
    mockserver-client-java
    3.10.8

La dernière version des dépendances est disponible enmockserver-netty etmockserver-client.

3. FonctionnalitéMockServer

En termes simples, l'outil peut:

  • générer et renvoyer des réponses fixes

  • transférer une demande vers un autre serveur

  • exécuter des callbacks

  • vérifier une demande

4. Comment exécuterMockServer

Nous pouvons démarrer le serveur de différentes manières - explorons certaines de ces méthodes.

4.1. Lancement via Maven Plugin

Cela lancera le serveur pendant la phaseprocess-test-class et s'arrêtera à la phaseverify:


    org.mock-server
    mockserver-maven-plugin
    3.10.8
    
        1080
        1090
        DEBUG
        org.mockserver.maven.ExampleInitializationClass
    
    
        
            process-test-classes
            process-test-classes
            
                start
            
        
        
            verify
            verify
            
                stop
            
        
    

4.2. Lancement via l'API Java

Nous pouvons utiliser l'API Java destartClientAndServer() pour démarrer le serveur. En règle générale, nous démarrons un serveur avant d'exécuter tous les tests:

public class TestMockServer {

    private ClientAndServer mockServer;

    @BeforeClass
    public void startServer() {
        mockServer = startClientAndServer(1080);
    }

    @AfterClass
    public void stopServer() {
        mockServer.stop();
    }

    // ...
}

5. Clients fictifs

L'APIMockServerClient est utilisée pour fournir une capacité de connexion auxMockServer.. Elle modélise les demandes et les réponses correspondantes du serveur.

Il supporte plusieurs opérations:

5.1. Créer des attentes avec des réponses simulées

Les attentes sont un mécanisme par lequel nous simulons la demande d'un client et la réponse résultante de MockServer.

Pour créer une attente, nous devons définir un gestionnaire de requêtes et une réponse à renvoyer.

Les demandes peuvent être associées à l'aide de:

  • chemin - chemin de l'URL

  • query string - Paramètres d'URL

  • en-têtes - demande des en-têtes

  • cookies - cookies côté client

  • body - Corps de la requête POST avec XPATH, JSON, schéma JSON, expression régulière, texte exact correspondant ou paramètres du corps

Tous les paramètres ci-dessus peuvent être spécifiés en utilisant du texte brut ou des expressions régulières.

Et une action de réponse contiendra:

  • codes de statut - codes de statut HTTP valides, par exemple. 200, 400 etc.

  • body - c'est la séquence d'octets contenant n'importe quel contenu

  • en-têtes - en-têtes de réponse avec nom et une ou plusieurs valeurs

  • cookies - cookies de réponse avec nom et une ou plusieurs valeurs

Voyons comment nous pouvonscreate an expectation:

public class TestMockServer {
    private void createExpectationForInvalidAuth() {
        new MockServerClient("127.0.0.1", 1080)
          .when(
            request()
              .withMethod("POST")
              .withPath("/validate")
              .withHeader("\"Content-type\", \"application/json\"")
              .withBody(exact("{username: 'foo', password: 'bar'}")),
              exactly(1))
                .respond(
                  response()
                    .withStatusCode(401)
                    .withHeaders(
                      new Header("Content-Type", "application/json; charset=utf-8"),
                      new Header("Cache-Control", "public, max-age=86400"))
                    .withBody("{ message: 'incorrect username and password combination' }")
                    .withDelay(TimeUnit.SECONDS,1)
                );
    }
    // ...
}

Ici, nous stubbing une requêtePOST au serveur. Et nous avons spécifié combien de fois nous devons faire cette demande en utilisant l'appel deexactly(1).

À la réception de cette demande, nous avons simulé une réponse avec les champs tels que le code d'état, les en-têtes et le corps de la réponse.

5.2. Transférer une demande

Une attente peut être configurée pour transmettre la demande. Quelques paramètres peuvent décrire l'action suivante:

  • host - l'hôte vers lequel transférer par ex. www.example.com

  • port - le port où la demande doit être transférée, le port par défaut est 80

  • scheme - protocole à utiliser, par ex. HTTP ou HTTPS

Voyons un exemple de demande de transfert:

private void createExpectationForForward(){
    new MockServerClient("127.0.0.1", 1080)
      .when(
        request()
          .withMethod("GET")
          .withPath("/index.html"),
          exactly(1))
        .forward(
          forward()
            .withHost("www.mock-server.com")
            .withPort(80)
            .withScheme(HttpForward.Scheme.HTTP)
           );
}

Dans ce cas, nous avons simulé une requête qui frappera exactement le serveur simulé, puis transmise à un autre serveur. La méthode externeforward() spécifie l'action de transfert et l'appel de la méthode interneforward() aide à construire l'URL et à transmettre la requête.

5.3. Exécution d'un rappel

L'action de rappel deThe server can be set to execute a callback when receiving a particular request. peut définir la classe de rappel qui implémente l'interface deorg.mockserver.mock.action.ExpectationCallback. Il devrait avoir le constructeur par défaut et devrait être sur le classpath.

Voyons un exemple d’attente avec un rappel:

private void createExpectationForCallBack() {
    mockServer
      .when(
        request().withPath("/callback"))
        .callback(
          callback()
            .withCallbackClass("com.example.mock.server.TestExpectationCallback")
        );
}

Ici, lecallback() externe spécifie l'action de rappel et la méthodecallback() interne spécifie l'instance de la classe de méthode de rappel.

Dans ce cas, lorsque MockServer reçoit une requête avec/callback,, la méthode de gestion de rappel implémentée dans la classe spécifiée sera exécutée:

public class TestExpectationCallback implements ExpectationCallback {

    public HttpResponse handle(HttpRequest httpRequest) {
        if (httpRequest.getPath().getValue().endsWith("/callback")) {
            return httpResponse;
        } else {
            return notFoundResponse();
        }
    }

    public static HttpResponse httpResponse = response()
      .withStatusCode(200);
}

5.4. Vérification des demandes

MockServerClient a la capacité de vérifier si le système testé a envoyé une requête:

private void verifyPostRequest() {
    new MockServerClient("localhost", 1080).verify(
      request()
        .withMethod("POST")
        .withPath("/validate")
        .withBody(exact("{username: 'foo', password: 'bar'}")),
        VerificationTimes.exactly(1)
    );
}

Ici, la classeorg.mockserver.verify.VerificationTimes est utilisée pour spécifier le nombre de fois que le serveur simulé doit correspondre à la demande.

6. Conclusion

Dans cet article rapide, nous avons exploré différentes fonctions du MockServer. Nous avons également exploré les différentes API fournies et leur utilisation pour tester des systèmes complexes.

Comme toujours, le code complet de cet article est disponibleover on GitHub.