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("2 John "))
.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.