Configurando o Sistema Sob Especificação com kotest-extensions-spring
Depois de concluirmos esta aula, nós:
- Saberemos como adicionar a dependência
kotest-extensions-springcom Maven e Gradle. - Compreenderemos como ativar a
SpringExtensiondo Kotest para integrar o Spring TestContext Framework às nossas especificações. - Saberemos como configurar o sistema sob especificação tanto em aplicações Spring MVC tradicionais quanto em aplicações Spring Boot 4.1.2 com
@SpringBootTest,@AutoConfigureMockMvce Testcontainers.
1. Obtendo as Dependências Necessárias
No Spock Framework, precisávamos declarar a dependência spock-spring para integrar o Spring TestContext Framework às especificações.
No Kotest 6, esse papel é cumprido pelo módulo oficial kotest-extensions-spring (io.kotest:kotest-extensions-spring, alinhado pelo kotest-bom:6.2.6). Ele fornece a extensão SpringExtension, que conecta o ciclo de vida do TestContextManager do Spring aos callbacks da especificação do Kotest e permite injetar beans do Spring diretamente no construtor da especificação!
Com Maven
Adicionamos a dependência kotest-extensions-spring-jvm no pom.xml:
|
|
Com Gradle 9.8.2 (Kotlin DSL)
Adicionamos io.kotest:kotest-extensions-spring na configuração da nossa suíte integrationTest:
|
|
[!IMPORTANT] Como ativar a
SpringExtensionno Kotest 6Você pode ativar a
SpringExtensionde duas maneiras:
- Por especificação: adicionando
extensions(SpringExtension)dentro do corpo da especificação (ou anotando a classe).- Globalmente para todo o projeto (Recomendado!): registrando
SpringExtensionna classeProjectConfig : AbstractProjectConfig()do seu projeto:
1 2 3 4 5 6 7 8package io.kotest.provided import io.kotest.core.config.AbstractProjectConfig import io.kotest.extensions.spring.SpringExtension class ProjectConfig : AbstractProjectConfig() { override fun extensions() = listOf(SpringExtension) }Com isso, qualquer especificação anotada com
@ContextConfiguration,@SpringBootTestou@DataJpaTestterá injeção de dependência e gerenciamento de transações do Spring habilitados automaticamente!
Vamos ver agora como configurar o sistema sob especificação tanto em uma aplicação Spring MVC tradicional quanto em uma aplicação Spring Boot 4!
2. Configurando Testes de Integração para Aplicações Spring Framework Tradicionais
Quando utilizamos o Spring Framework clássico (sem auto-configuração do Spring Boot), configuramos nossa classe de especificação de integração seguindo cinco passos:
- Configuramos a classe de configuração do contexto (
@ContextConfiguration(classes = [IntegrationTestContext::class])). - Se o
ApplicationContextcarregado for umWebApplicationContext, anotamos a especificação com@WebAppConfiguration. - Garantimos que os listeners padrão do Spring Test (
DependencyInjectionTestExecutionListener,TransactionalTestExecutionListener,SqlScriptsTestExecutionListener,WithSecurityContextTestExecutionListener) estejam ativos. - Garantimos que os testes de integração rodem com o perfil Spring
"integrationTest"(@ActiveProfiles(Profiles.INTEGRATION_TEST)). - Registramos
extensions(SpringExtension)na especificação:
|
|
Se estivermos testando um repositório ou serviço, basta receber o bean no construtor da especificação (class ExampleSpringSpec(private val repository: TaskRepository) : BehaviorSpec(...)). E se estivermos testando um controlador Spring MVC em uma aplicação Spring tradicional (sem Spring Boot), injetamos o WebApplicationContext e construímos o MockMvc com springSecurity() no callback beforeEach (ou diretamente como propriedade):
|
|
3. Configurando Testes de Integração para Aplicações Spring Boot 4
Quando utilizamos o Spring Boot 4.1.2, tiramos proveito dos recursos de auto-configuração do Spring Boot Test para eliminar todo o código repetitivo acima!
Fazemos isso em três passos:
- Substituímos
@ContextConfiguratione@WebAppConfigurationpela anotação@SpringBootTest(classes = [IntegrationTestContext::class]). - Se precisarmos do
MockMvc(com os filtros do Spring Security já integrados automaticamente!), basta adicionar a anotação@AutoConfigureMockMvcna classe de especificação. - Injetamos o
MockMvcdiretamente no construtor da classe de especificação do Kotest!
Veja como a nossa classe de especificação fica limpa e concisa com Spring Boot 4 e Kotest 6:
|
|
Resumo
Nesta aula, aprendemos três pontos fundamentais:
- O módulo
io.kotest:kotest-extensions-springintegra o Spring TestContext Framework ao Kotest 6 por meio daSpringExtension. - A versão de
kotest-extensions-springdeve estar alinhada comkotest-runner-junit5(o que é garantido automaticamente ao usar oio.kotest:kotest-bom:6.2.6). - Em aplicações Spring Boot 4, combinamos
@SpringBootTest,@AutoConfigureMockMvce injeção no construtor da especificação para ter oMockMvce o Spring Security prontos para uso sem nenhum código boilerplate.