Introdução ao MockServer

Introdução ao MockServer

1. Visão geral

MockServer é uma ferramenta para simulação / stubbing de APIs HTTP externas.

2. Dependências do Maven

Para usarMockServer em nosso aplicativo, precisamos adicionar duas dependências:


    org.mock-server
    mockserver-netty
    3.10.8


    org.mock-server
    mockserver-client-java
    3.10.8

A última versão das dependências está disponível comomockserver-nettyemockserver-client.

3. Funcionalidade deMockServer

Simplificando, a ferramenta pode:

  • gerar e retornar respostas fixas

  • encaminhar uma solicitação para outro servidor

  • executar retornos de chamada

  • verificar uma solicitação

4. Como executarMockServer

Podemos iniciar o servidor de algumas maneiras diferentes - vamos explorar alguns desses métodos.

4.1. Lançamento via plug-in Maven

Isso iniciará o servidor durante a faseprocess-test-classe parará na faseverify:


    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. Lançamento via API Java

Podemos usar a API JavastartClientAndServer() para iniciar o servidor. Normalmente, iniciaríamos um servidor antes de executar todos os testes:

public class TestMockServer {

    private ClientAndServer mockServer;

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

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

    // ...
}

5. Clientes Falsos

A APIMockServerClient é usada para fornecer um recurso de conexão com as solicitações de modelosMockServer. e as respostas correspondentes do servidor.

Ele suporta várias operações:

5.1. Criação de expectativas com respostas simuladas

As expectativas são um mecanismo pelo qual simulamos a solicitação de um cliente e a resposta resultante do MockServer.

Para criar uma expectativa, precisamos definir um correspondente de solicitação e uma resposta que deve ser retornada.

Os pedidos podem ser correspondidos usando:

  • path - caminho da URL

  • query string - parâmetros de URL

  • cabeçalhos - solicitar cabeçalhos

  • cookies - cookies do lado do cliente

  • body - corpo da solicitação POST com esquema XPATH, JSON, JSON, expressão regular, texto simples ou parâmetros do corpo correspondentes

Todos os parâmetros acima podem ser especificados usando texto simples ou expressões regulares.

E uma ação de resposta conterá:

  • códigos de status - códigos de status HTTP válidos, por exemplo 200, 400 etc.

  • body - é a sequência de bytes que contém qualquer conteúdo

  • cabeçalhos - cabeçalhos de resposta com nome e um ou mais valores

  • cookies - cookies de resposta com nome e um ou mais valores

Vamos ver como podemoscreate 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)
                );
    }
    // ...
}

Aqui, estamos efetuando o stub de uma solicitaçãoPOST para o servidor. E especificamos quantas vezes precisamos fazer essa solicitação usando a chamadaexactly(1).

Ao receber essa solicitação, zombamos de uma resposta com os campos como código de status, cabeçalhos e corpo da resposta.

5.2. Encaminhando uma solicitação

A expectativa pode ser configurada para encaminhar a solicitação. Alguns parâmetros podem descrever a ação direta:

  • host - o host para o qual encaminhar, por exemplo www.example.com

  • port - a porta para onde a solicitação a ser encaminhada, a porta padrão é 80

  • scheme - protocolo a ser usado, por exemplo HTTP ou HTTPS

Vejamos um exemplo de solicitação de encaminhamento:

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

Nesse caso, zombamos de uma solicitação que atingirá exatamente o MockServer e depois encaminhada para outro servidor. O métodoforward() externo especifica a ação de encaminhamento e a chamada do métodoforward() interno ajuda a construir a URL e encaminha a solicitação.

5.3. Executando um Callback

A ação de retorno de chamadaThe server can be set to execute a callback when receiving a particular request. pode definir a classe de retorno de chamada que implementa a interfaceorg.mockserver.mock.action.ExpectationCallback. Ele deve ter o construtor padrão e deve estar no caminho de classe.

Vejamos um exemplo de expectativa com um retorno de chamada:

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

Aqui, ocallback() externo especifica a ação de retorno de chamada e o métodocallback() interno especifica a instância da classe do método de retorno de chamada.

Nesse caso, quando MockServer recebe uma solicitação com/callback,, o método de manipulação de retorno de chamada implementado na classe especificada será executado:

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. Verificando Solicitações

MockServerClient tem a capacidade de verificar se o sistema em teste enviou uma solicitação:

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

Aqui, a classeorg.mockserver.verify.VerificationTimes é usada para especificar o número de vezes que o Servidor Mock deve corresponder à solicitação.

6. Conclusão

Neste artigo rápido, exploramos diferentes funções do MockServer. Também exploramos as diferentes APIs fornecidas e como elas podem ser usadas para testar sistemas complexos.

Como sempre, o código completo deste artigo está disponívelover on GitHub.