Este projeto é uma base de exemplos para iniciar novos projetos utilizando Quarkus.
Algumas escolhas são baseadas na minha opinião sobre alguns conceitos, como:
- Focar na facilidade de executar testes unitários de verdade, separados dos testes de Quarkus.
- Focar em um design que facilite a execução de testes unitários com Mocks.
- Entre outros.
Então não entenda como "a melhor forma" de criar um projeto Quarkus, mas sim como um exemplo de utilização de:
- Extensões do Quarkus.
- Especificações do MicroProfile.
- Bibliotecas que acho que "encaixam bem" com o Quarkus.
- Padrões que considero mais razoáveis.
A seguir é uma lista do que está sendo exemplificado neste projeto até o momento.
Especificação MicroProfile:
- JAX-RS
- JSON-B
- CDI
- MicroProfile Fault Tolerance
- MicroProfile Health Check
- MicroProfile Config
Extensões Quarkus (fora do MicroProfile):
- Hibernate Panache
- JDBC PostgreSQL
- OpenID Connect Adapter
- Da forma como está implementada no código, poderia ser MicroProfile JWT. Apenas preferi utilizar a extensão de OpenID pois possui mais recursos e existe uma grande chance de você precisar utilizar em produção.
Bibliotecas externas:
- Log com SLF4J
- MapStruct
- Lombok
Testes Unitários:
- JUnit5/Jupiter
- Mockito
- JaCoCo
Testes de Mutação:
- Pitest (PIT)
Testes de Quarkus:
- Quarkus
- Rest Assured
- TestContainers
- Elytron
Infra:
- Keycloak
- PostgreSQL
Aceito sugestões de novas extensões/bibliotecas para exemplificar. :)
- Esse projeto usa Maven, então importe como projeto Maven na sua IDE.
- Pelo uso de MapStruct, o projeto requer que Java Annotation Processing esteja habilitado na IDE.
- Pelo uso de Lombok, é necessário instalar o lombok como plugin na sua IDE.
Esse projeto é fortemente contruído ao redor do Quarkus!
- Docker: É necessário ter o Docker instalado para rodar os testes integrados ou executar a aplicação, pois vários exemplos utilizam imagens do docker. Instalação do Docker.
- JDK 10~13: É necessário ter uma JDK entre as versões 10 e 13 disponível localmente e configurada no JAVA_HOME.
Para executar todos os testes (de unidade, de mutação, e de quarkus):
./mvnw clean tests
Para executar somente os testes de unidade:
./mvnw clean test -DskipMutationTests -DskipQuarkusTests
Para executar somente os testes de mutação:
./mvnw clean test -DskipUnitTests -DskipQuarkusTests
Para executar somente os testes de quarkus:
./mvnw clean test -DskipMutationTests -DskipUnitTests
Execute todos os comandos na raiz do projeto.
- Inicie um banco PostgreSQL em um container Docker com o comando:
docker run -e POSTGRES_PASSWORD=quarkus_dev -e POSTGRES_USER=quarkus_dev -e POSTGRES_DB=frutas -p 127.0.0.1:5432:5432/tcp postgres:9.6.12
- Inicie o Keycloak em um container Docker com o comando (no windows talvez a variável ${PWD} seja diferente):
docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e KEYCLOAK_IMPORT=/tmp/quarkus-realm.json -v ${PWD}/quarkus-realm.json:/tmp/quarkus-realm.json -p 8180:8080 jboss/keycloak
- Execute a aplicação no modo dev, que permite live coding (salvou, tá visível), com o comando abaixo:
./mvnw quarkus:dev
Se tiver algum problema de classe/método/construtor inexistente, pode ser que as anotações do Lombok ou MapStruct não tenham sido processadas corretamente. Nesse caso, experimente fazer um ./mvnw compile quarkus:dev
.
Para empacotar a aplicação utilize o comando ./mvnw clean package -DskipTests=true
.
Esse comando irá criar o jar quarkus-example-app-X.X.X-runner.jar
no diretório /target
.
Para executar a aplicação empacotada utilize o comando java -jar target/quarkus-example-app-X.X.X-runner.jar
.
Perceba que a aplicação não precisa ser implantada em um servidor.
Com o Quarkus é possível criar imagens nativas, super leves e com tempo de inicialização super rápido. A princípio, esse não é o objetivo desse projeto de exemplo. Caso queira saber mais, veja aqui.
A maior parte do que está sendo usado contém documentação própria, então não convém explicar a utilização nesse projeto, apenas exemplificar. Abaixo estão apresentadas a maiorias das biliotecas utilizadas, suas funções básicas e suas respectivas documentações.
- Quarkus: Framework poderoso para criar aplicações Java cloud-ready.
- MicroProfile: Conjunto de especificações que facilitam a criação de Microsserviços.
- JUnit5/Jupiter: Framework para implementação e execução de testes.
- Mockito: Framework para criar Mocks dentro dos testes.
- JaCoCo: Ferramenta para gerar relatórios de cobertura dos testes.
- Pitest (PIT): Ferramenta para gerar e executar testes de mutação.
- Quarkus: Quarkus também pode ser utilizado para rodar testes.
- Rest Assured: Framework para validação de endpoints rest.
- TestContainers: Framework para criação de containers docker durante o teste.
Ótimo! Veja como aqui.