Gerador de serviços mockados estupidamente simples
- Gerar um serviço rest mockado sem preocupações de infraestrutura
- Serviços simples, sem qualquer inteligência
- Possibilidade de respostas distintas de acordo com a presença de conteúdo na requisição
- Respondendo os verbos mais comuns (GET, POST, PUT, DELETE), outros podem ser implementados se necessário
O objetivo principal é criar um endpoint rest local que responda sempre o mesmo conteúdo dado que o corpo da mensagem contenha determinada string.
O servidor e os serviços são criados programaticamente, para serem incluídos em um teste unitário, uma aplicação web ou um servidor remoto. O servidor responde em localhost, em uma porta definida.
Cria o servidor na porta padrão (7777) respondendo à GET /test
e, se
xpto estiver no body da requisição, responde Hello World:
localhost().get("/test").contains("xpto").respond("Hello World");
Cria o servidor na porta 8888 respondendo à POST /test
e, se xpto e 1234 estiverem
no body, responde com o conteúdo do arquivo /test/hello.json
localhost(8888).post("/test").contains("xpto").and().contains("1234")
.respond(withFile("/test/hello.json"));
Responde à POST /test
de acordo com o conteúdo do body, caindo no caso default (último)
se não encontrar nenhuma correspondência
localhost().post("/test").contains("test1").respond(withFile("/test/1.json"));
localhost().post("/test").contains("test2").respond(withFile("/test/2.json"));
localhost().post("/test").respond(withFile("File not found"));
Responde a GET /test/:n
de acordo com o parâmetro :n
da query usando um arquivo
de template test.json.ftl
freemarker
localhost().get("/test/:n").buildResponse("test.json.ftl", 200,
att -> att.put("param_n", req -> req.params("n")));
Como criar os serviços mockados em uma aplicação dentro de um servlet container qualquer (Ex. tomcat, liberty, jboss)
Para testes unitários basta a chamada aos métodos de criação de rotas, como acima,
preferencialmente em um método @BeforeClass
. Se for necessário executar
testes em uma aplicação web publicada, os serviços podem ser iniciados na mesma
aplicação com a utilização de um filtro.
A sintaxe de criação de rotas não é alterada, mas naturalmente a porta não deve ser utilizada.
<!-- Mocks -->
<dependency>
<groupId>net.technearts</groupId>
<artifactId>rip</artifactId>
<version>0.0.5</version>
</dependency>
package rest.mock;
import static net.technearts.rip.RipServer.localhost;
import static net.technearts.rip.RipServer.withFile;
import net.technearts.rip.RipWebApp;
public class RestMock extends RipWebApp {
@Override
public void setup() {
localhost().post("/test").contains("0123456789")
.respond(withFile("/files/test1.json"));
localhost().post("/test")
.respond(withFile("/files/test2.json"));
}
}
<filter>
<filter-name>RipFilter</filter-name>
<filter-class>net.technearts.rip.RipWebFilter</filter-class>
<init-param>
<param-name>applicationClass</param-name>
<param-value>rest.mock.RestMock</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Obs.: o serviço irá responder na mesma porta e contexto da aplicação!
- /files/test1.json
- /files/test2.json
Obs.: Para abrir no eclipse é preciso instalar o lombok
Relatórios e documentação do projeto aqui