Spring
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Kotest ofrece una extensión para Spring que te permite probar código que utiliza el framework Spring para inyección de dependencias.
Si prefieres ver un ejemplo en lugar de leer documentación, hay un proyecto de muestra usando Spring WebFlux aquí
Para usar esta extensión, debes agregar el módulo io.kotest:kotest-extensions-spring a la ruta de compilación de pruebas. La versión más reciente siempre se puede encontrar en Maven Central aquí.
Desde Kotest 6.0, todas las extensiones se publican nuevamente bajo el grupo io.kotest, con una cadencia de versiones vinculada a
los lanzamientos principales de Kotest.
La extensión Spring requiere activación para todas las clases de prueba o por clase individual. Para activarla globalmente,
registra SpringExtension en la configuración del proyecto:
package io.kotest.provided
import io.kotest.core.config.AbstractProjectConfig
import io.kotest.extensions.spring.SpringExtension
class ProjectConfig : AbstractProjectConfig() {
override val extensions = listOf(SpringExtension())
}
Para activarla por clase de prueba:
import io.kotest.core.extensions.ApplyExtension
import io.kotest.extensions.spring.SpringExtension
@ApplyExtension(SpringExtension::class)
class MyTestSpec : FunSpec() {}
Para indicar a Spring qué clase de configuración usar, debes anotar tus clases Spec con @ContextConfiguration.
Esto debe apuntar a una clase anotada con la anotación @Configuration de Spring. Alternativamente, puedes usar
@ActiveProfiles para
referenciar un archivo de contexto de aplicación específico.
En Kotest 4.3 y anteriores, la extensión Spring se llamaba SpringListener. Esta extensión está ahora obsoleta en favor de SpringExtension. El uso es el mismo, pero SpringExtension tiene más funcionalidades.
Inyección mediante constructor
Para inyección por constructor, Kotest registra automáticamente un SpringAutowireConstructorExtension
cuando se agrega el módulo spring al build, asumiendo que el autoescaneo está activado (ver Configuración del Proyecto). Si el autoescaneo está
desactivado, deberás cargar manualmente la extensión en tu configuración de proyecto.
Esta extensión interceptará cada llamada para crear una instancia de Spec y realizará la inyección automática de los beans declarados en el constructor primario.
El siguiente ejemplo muestra una clase de prueba que requiere un servicio llamado UserService en su constructor primario. Esta clase
de servicio es un bean Spring normal anotado con @Component.
@ContextConfiguration(classes = [(Components::class)])
class SpringAutowiredConstructorTest(service: UserService) : WordSpec() {
init {
"SpringExtension" should {
"have autowired the service" {
service.repository.findUser().name shouldBe "system_user"
}
}
}
}
Contextos de prueba
La extensión Spring hace disponible TestContextManager a través del contexto de corrutinas donde se ejecutan las pruebas. Puedes
obtener una referencia a esta instancia mediante el método de extensión testContextManager().
Desde aquí puedes obtener el testContext que Spring está utilizando.
class MySpec(service: UserService) : WordSpec() {
init {
"SpringExtension" should {
"provide the test context manager" {
println("The context is " + testContextManager().testContext)
}
}
}
}
Callbacks de métodos de prueba
Spring tiene varios callbacks como beforeTestMethod que se basan en la idea de que las pruebas son métodos.
Esta suposición funciona para frameworks heredados como JUnit pero no aplica a frameworks modernos como Kotest donde las pruebas son funciones.
Por lo tanto, cuando uses un estilo de spec anidado, puedes personalizar cuándo se activan los callbacks de métodos de prueba. Por defecto, se activan en el nodo hoja. Puedes configurarlos para que se activen en los nodos raíz pasando un argumento SpringTestLifecycleMode a la extensión:
class ProjectConfig : AbstractProjectConfig() {
override val extensions = listOf(SpringExtension(SpringTestLifecycleMode.Root))
}
Clases finales
Al usar una clase final, puedes recibir una advertencia de Kotest:
Using SpringListener on a final class. If any Spring annotation fails to work, try making this class open
Si lo deseas, puedes desactivar esta advertencia configurando la propiedad del sistema kotest.listener.spring.ignore.warning a true.