Introdução ao Hoverfly em Java

Introdução ao Hoverfly em Java

1. Visão geral

Neste artigo, daremos uma olhada na biblioteca JavaHoverfly - que fornece uma maneira fácil de criar stubs / simulações de API reais.

2. Dependências do Maven

Para usar o Hoverfly, precisamos adicionar uma única dependência do Maven:


    io.specto
    hoverfly-java
    0.8.1

A versão mais recente pode ser encontradahere.

3. Simulando uma API

Primeiro, vamos configurar o Hoverfly para rodar no modo de simulação. The simplest way to define a simulation is by using a DSL.

Vamos começar com um exemplo simples instanciando a instânciaHoverflyRule:

public static final HoverflyRule rule
  = HoverflyRule.inSimulationMode(dsl(
    service("http://www.example.com")
      .get("/api/courses/1")
      .willReturn(success().body(
        jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))));

A classeSimulationSource fornece um métododsl para iniciar a definição da API. Além disso, o métodoHoverflyDSL'sservice nos permite definir um ponto de extremidade e caminhos de solicitação associados.

Em seguida, chamamoswillReturn para declarar qual resposta queremos obter em retorno. Também usamos o métodosuccess deResponseBuilder para definir o status e o corpo da resposta.

4. Usando JUnit para teste

A API de stubbed pode ser facilmente testada usando o JUnit.

Vamos criar um teste simples enviando uma solicitação HTTP e ver se chega ao endpoint:

responseEntity courseResponse
  = restTemplate.getForEntity("http://www.example.com/api/courses/1", String.class);

assertEquals(HttpStatus.OK, courseResponse.getStatusCode());
assertEquals("{\"id\":\"1\",\"name\":\"HCI\"}", courseResponse.getBody());

Usamos a instância de classeRestTemplate do módulo Spring Web para enviar uma solicitação HTTP.

5. Adicionando atrasos

Atrasos podem ser adicionados globalmente, para um método HTTP específico ou para uma chamada de API específica.

Aqui está o exemplo de atraso na configuração do código em solicitações com o método POST:

SimulationSource.dsl(
  service("http://www.example.com")
    .post("/api/courses")
    .willReturn(success())
    .andDelay(3, TimeUnit.SECONDS)
    .forMethod("POST")
)

6. Solicitador de Correspondência

A classe de fábricaHoverflyMatchers fornece vários matchers incluindoexactMatcheglobMatch para URLs. Para o corpo HTTP, ele fornece.

Para corpos HTTP, ele forneceJSON/XML correspondência exata eJSONPath/XPath correspondências.

Por padrão, o matcherexactMatch é usado para correspondência de URL e corpo.

Aqui está um exemplo de uso de diferentes correspondentes:

SimulationSource.dsl(
  service(matches("www.*dung.com"))
    .get(startsWith("/api/student"))
    .queryParam("page", any())
    .willReturn(success())

    .post(equalsTo("/api/student"))
    .body(equalsToJson(jsonWithSingleQuotes("{'id':'1','name':'Joe'}")))
    .willReturn(success())

    .put("/api/student/1")
    .body(matchesJsonPath("$.name"))
    .willReturn(success())

    .post("/api/student")
    .body(equalsToXml("2John"))
    .willReturn(success())

    .put("/api/student/2")
    .body(matchesXPath("/student/name"))
    .willReturn(success()));
)

Neste exemplo, o métodomatches verifica o URL comglobMatch que permite a pesquisa curinga.

EntãostartsWith verifica se o caminho da solicitação começa com “/api_ / student_“. Usamos o matcherany para permitir todos os valores possíveis no parâmetro de consulta da página.

O matcherequalsToJson certifica-se de que a carga útil do corpo corresponde ao JSON exato fornecido aqui. O métodomatchesJsonPath para verificar um elemento em um determinado caminho JSON existe ou não.

Da mesma forma,equalsToXml corresponde ao XML fornecido no corpo da solicitação com o fornecido aqui. OmatchesXPath corresponde a um corpo com uma expressão XPath.

7. Conclusão

Neste tutorial rápido, discutimos o uso da biblioteca Java Hoverfly. Procuramos simular serviços HTTP, DSL para configurar pontos de extremidade, adicionar atrasos e usar os correspondentes de solicitação. Também analisamos esses serviços usando o JUnit.

Como sempre, trechos de código, como sempre, podem ser encontradosover on GitHub.