Como buildar e testar¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-14
Pré-requisitos (JDK 25 no JAVA_HOME, Docker) e como subir o app: Como rodar.
Testes¶
./gradlew test # todos; exige Docker (Testcontainers)
./gradlew test --tests "br.com.xadm.integracao.central.login.PabastLoginControllerTest"
./gradlew check # o gate da CI: checkstyle, testes, ArchUnit e cobertura
Postgres de teste¶
Um container só (postgres:18-alpine, com os dados em tmpfs) serve a JVM de teste inteira: é o
singleton PostgresTestResource da xadm-comum-teste, e o Flyway migra o schema uma vez. A primeira
classe leva uns 20 s, que é a subida do container; as seguintes reusam o banco. Não há como apontar os
testes para um banco externo.
Teste de integração estende o IntegracaoComPostgres da xadm-comum-teste (@TestInstance(PER_CLASS) e
PostgresTestPropertyProvider). Antes de cada teste ela esvazia todas as tabelas do schema public,
menos o histórico do Flyway; o seed vai no @BeforeEach da própria classe, que roda depois da limpeza.
Regra da casa em Java/Micronaut, Testes.
- Exceção: os testes de linha do tempo de migração (V11, V13 e V14) sobem container próprio, porque migram um schema do zero até um alvo e semeiam dado legado no meio.
- Armadilha: o
TestPropertyProviderdo Micronaut estendeSupplier, então a classe de teste não pode declarar um métodoget()— e umimport staticdeWireMock.getfica escondido pelo herdado.
Travas¶
Teste que trava vira falha em vez de segurar o CI: 2 min por teste (junit-platform.properties,
desligado sob debug), 15 min para a task test e 5 s para obter conexão do pool de teste.
Cobertura¶
O check imprime a cobertura de linhas (JaCoCo) ao final — visível, não bloqueante: piso bloqueante
seria opt-in, por decisão em decisoes/. A jacoco.toolVersion precisa ser ≥ 0.8.15, porque as
anteriores não instrumentam o class major do Java 25 e geram um falso 0%. O denominador exclui o código
gerado ($Introspection, $Definition, $Intercepted e os Serde* do micronaut-serde).
Os pontos de maior risco têm teste dedicado: JwtServiceTest (emissão e JWKS com alg=RS256),
AesCipherTest (round-trip e adulteração), PabastPasswordHasherTest (compatibilidade com os hashes de
produção) e RateLimiterTest (limites e extração de IP).
Transporte de e-mail, sem Docker. SmtpEmailSenderSocketTest sobe um SMTP de mentira num
ServerSocket local (diálogo, dot-stuffing, recusa 5xx, host fora do ar), e ResendEmailSenderTest
aponta o RESEND_ENDPOINT para um WireMock (payload, header Authorization, 2xx, 4xx/5xx, conexão
recusada). O NewAccessRequestNotifierTest prova o fail-open: transporte estourando não derruba o login.
Build¶
./gradlew shadowJar # jar executável em build/libs/app.jar
docker build -t central-backend . # imagem JVM, para build e diagnóstico locais
docker build -f Dockerfile.native -t central-backend:native-test . # a imagem de produção
Produção é native-only (decisão 0030): a CI builda o
Dockerfile.native e publica a imagem; o Coolify só a puxa.