Wiremock é uma ferramenta que auxilia a criação de mocks.
Site oficial: http://wiremock.org/
Exemplo simples utilizando o jar do wiremock.
Faça download o jar standalone em http://repo1.maven.org/maven2/com/github/tomakehurst/wiremock-standalone/2.8.0/wiremock-standalone-2.8.0.jar
Para rodar o wiremock, executar o comando java no terminal no mesmo path onde encontra-se o jar:
java -jar wiremock-standalone-2.8.0.jar
Por default, a porta é 8080. Para rodar em uma porta específica, basta configurar:
java -jar wiremock-standalone-2.8.0.jar --port 8085
O wiremock será inicializado.
Para criar um mapeamento simples, vamos supor uma requisição GET que retorne code 200 (sucesso) e retorne um json.
para isso, dentro da pasta onde está o jar do mock, dentro de uma pasta mappings, no mesmo path de onde encontra-se o jar do wiremock, devemos criar um arquivo .json mapeando a request, qual o method, a url e ainda qual a response, com o status code e um body.
{ "request": { "method": "GET", "url": "/alguma/url" }, "response": { "status": 200, "body": "Alguma url foi chamada com sucesso!!!", "headers": { "Content-Type": "text/plain" } }
Nota: para que a alteração faça efeito, é necessário restartar o wiremock, apenas finalizando a execução atual e executando o java -jar novamente.
Fazendo o restart, ao entrar num browser no endereço http://localhost:8085/alguma/url teremos o seguinte resultado:
Uma outra forma de trabalhar com wiremock é mapear num response um outro json como resposta.
Para isso, criamos um novo arquivo .json dentro da pasta mappings, com o seguinte mapeamento:
{ "request": { "method": "GET", "url": "/alguma/url2" }, "response": { "status": 200, "bodyFileName": "result1.json", "headers": { "Content-Type": "application/json" } } }
Note que o response aponta para um arquivo result1.json. Esse arquivo deve ficar numa pasta __files, na mesma altura de onde encontra-se o jar do wiremock.
Esse arquivo possui o seguinte conteúdo:
{ "campo1": "valor1", "campo2": 123, "campo3": { "campo3.1":"tst", "campo3.2":2342342342343434 } }
Ao executar então a nova url mapeada http://localhost:8085/alguma/url2 teremos o seguinte resultado:
Exemplo de mock retornando erro:
{ "request": { "method": "GET", "url": "/algum/erro" }, "response": { "status": 404 } }
Alguns status comuns de serem mapeados:
200 ok
201 created
404 not found
403 forbidden
405 method not allowed
500 internal server error
502 bad gateway
503 Service Unavailable
Lista com todos os status: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Para mapear o wiremock para que parte do que está na request seja usado como resposta, é preciso configurar o response templating. Para isso, ao executar o comando para inicializar o wiremock, é necessário passar o parâmetro –global-response-templating
java -jar wiremock-standalone-2.8.0.jar --port 8085 --global-response-templating
Exemplo simples de uma request em que o último parâmetro da url será usado como resposta.
Mapeamento da request:
{ "request": { "method": "GET", "urlPattern": "/alguma/url3/.*" }, "response": { "status": 200, "bodyFileName": "result2.json", "headers": { "Content-Type": "application/json" } } }
Nesse caso foi mapeado um pattern de url, onde qualquer chamada a /alguma/url3/ mais algum parâmetro, deverá responder o que está mapeado nesse response.
Mapeamento do response, pegando o valor que está na url utilizando o request path:
{ "campo1": {{request.path.[2]}}, "campo2": 123, "campo3": { "campo3.1":"tst", "campo3.2":2342342342343434 } }
Note que o parâmetro utilizado é o segundo [2]. O primeiro item da url é mapeado como 0.
Dessa forma temos para 0 a palavra “alguma”, para 1 a palavra “url3” e para 2 o que for digitado na url.
Caso seja solicitada a seguinte url http://localhost:8085/alguma/url3/123456, teremos o seguinte resultado:
Ou ainda, caso seja solicitada a seguinte url http://localhost:8085/alguma/url3/unicorn, teremos o seguinte resultado:
#SQN só que não 😛 rs
Além de GET, também é possível mapear POST, DELETE, etc, sempre mantendo a idéia de qual a url ou url pattern da request, qual o method, e qual o response e status code de retorno.
Para mais informações e também outras formas de usar o wiremcock: http://wiremock.org/docs/getting-started/
Exemplo utilizado nesse post pode ser encontrado em https://github.com/reyoko/wiremock-simple-example