Tecnologia

Ambiente controlado para testes – Parte 2: MockWebserver

Por: , dezembro 4, 2018

Confira nossa série sobre testes automatizados no Android:

Quando estamos testando aplicações que fazem requisições para serviços externos, devemos evitar fazer chamadas para serviços reais para evitar problemas como instabilidade nos serviços e de conectividade e mais importante, para podermos ter previsibilidade de quais serão as respostas e poder escrever nossos testes baseados nessas respostas.
Podemos simplesmente criar mocks e retornar os valores que precisamos, como vimos no artigo anterior. Essa seria a forma mais simples de resolver a questão. Porém, dessa forma você deixaria sem cobertura de teste toda a sua estrutura de requisições e dependendo da quantidade de chamadas para serviços, você teria que construir um número muito grande de mocks. Uma forma de fazer os testes mantendo o fluxo das suas requisições intacto é o uso de alguma ferramenta que te permita interceptar as requisições que são realizadas e retornar uma resposta pré definida.   
Uma ferramenta bastante poderosa e ainda assim super simples de utilizar criada pela Square, mesma criadora da Okhttp uma das ferramentas mais utilizadas para requisições em aplicativos Android e várias outras que você deve até já usar e não sabe que é dela, é a MockWebServer. Essa ferramenta permite que você intercepte as requisições feitas e faça as manipulações que sejam necessárias, como verificar se os headers corretos foram enviados e definir o código e o json que serão retornados como resposta daquela chamada.
Para tanto,  basta adicionar a dependência para a lib:
https://gist.github.com/DiegoGSantos/46b1c13000dda162a11924117abab5a7
Feito isso, utilizar a lib é muito simples. Como você pode verificar no código abaixo, você precisa iniciar o mockServer no seu método @Before da sua classe de testes. Depois você tem duas formas de definir suas respostas. A mais simples é apenas chamar o método “enqueue” que basicamente coloca as respostas em uma fila e o mockServer apenas retorna aquelas respostas na ordem que foram adicionadas na fila conforme cada chamada, não importando para o mock server qual o path ou dados enviados na requisição, ele apenas retorna a resposta que estiver na fila.
Note o método “getJson” que apenas está buscando os arquivos json que adicionei em uma pasta chamada “json” dentro do package resources e retornando eles como String para serem adicionados na resposta “mockada” adicionada na fila.
https://gist.github.com/DiegoGSantos/46bff444d4900f1877933b590e5fb5b2
Para casos mais simples esse formato já é suficiente. No entanto, em alguns casos você pode precisar de algo mais completo, como um servidor mock que retorna a resposta para um path específico ou até mesmo valida headers e parâmetros e retorna respostas específicas para cada caso. Nesse caso você pode definir um dispatcher que faz esses tratamentos das requests e te traz um servidor mock quase tão funcional quanto um servidor real.
https://gist.github.com/DiegoGSantos/4502eb8780f7c4ddc840465fda86df9b
E é isso! Usando essa ferramenta relativamente simples, você consegue ter liberdade para testar suas funcionalidades tendo a previsibilidade necessária sem modificar seu fluxo normal de funcionamento. Espero que seja útil nos seus próximos testes. No próximo artigo[Em breve], vamos falar um pouco sobre como testar funcionalidades que envolvem coisas externas a nossa aplicação.
Até a próxima!

  • Receba nosso conteúdo em primeira mão.