Ir al contenido principal
Versión: 6.0

Spring

[Traducción Beta No Oficial]

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.

consejo

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í.

nota

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.

nota

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.