Ir al contenido principal
Versión: 6.1

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.

Primeros pasos

consejo

Si prefieres ver un ejemplo en lugar de leer documentación, hay un proyecto de ejemplo que utiliza Spring WebFlux aquí

Para usar esta extensión, debes añadir 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 que la actives para todas las clases spec, o por cada clase spec. Para activarla globalmente, puedes registrar SpringExtension en la configuración del proyecto:

class ProjectConfig : AbstractProjectConfig() {
override val extensions = listOf(SpringExtension())
}

Alternativamente, puedes registrar la extensión por cada clase spec mediante la anotación @ApplyExtension.

@ApplyExtension(SpringExtension::class)
class MyTestSpec : FunSpec() {}

Para que Spring sepa qué clase de configuración usar, debes anotar tus clases Spec con anotaciones de prueba de Spring como @Configuration. Esto debe apuntar a una clase anotada con la anotación @Configuration de Spring. Alternativamente, puedes usar @ActiveProfiles para apuntar a un archivo de contexto de aplicación específico.

nota

En Kotest 4.3 y versiones anteriores, la extensión Spring se llamaba SpringListener. Esta extensión ahora está obsoleta a favor de SpringExtension. El uso es el mismo, pero SpringExtension tiene más funcionalidades.

Inyección por Constructor

Cuando la extensión Spring está activa, Kotest se encargará automáticamente de instanciar tus clases de prueba usando el constructor primario. Esto incluye la inyección automática de parámetros del constructor.

El siguiente ejemplo es una clase de prueba que requiere un servicio llamado UserService en su constructor primario. Esta clase UserService es simplemente un bean de Spring regular que ha sido 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)
}
}
}
}

Eventos de Ejecución de Pruebas

Spring tiene varios Eventos de Ejecución de Pruebas como BeforeTestMethod y BeforeTestExecution. Estos eventos asumen que las pruebas son métodos, por lo que no se corresponden exactamente con pruebas definidas en frameworks como Kotest, donde las pruebas son funciones y pueden anidarse arbitrariamente.

Puedes personalizar cuándo se activan estas callbacks usando el enum SpringTestLifecycleMode al crear la extensión. Por defecto, se activan en pruebas hoja. Puedes configurarlas para que se activen en pruebas raíz pasando un argumento SpringTestLifecycleMode.Root a la extensión:

class ProjectConfig : AbstractProjectConfig() {
override val extensions = listOf(SpringExtension(SpringTestLifecycleMode.Root))
}
consejo

Si quieres usar el modo root con @ApplyExtension, debes usar la subclase SpringRootTestExtension, por ejemplo @ApplyExtension(SpringRootTestExtension::class).

Orden de los eventos

Spring define un orden de precedencia para cuándo se activan los callbacks. Hay cuatro eventos que pueden dispararse relacionados con pruebas. Estos son:

  • BeforeTestMethodEvent
  • BeforeTestExecutionEvent
  • AfterTestExecutionEvent
  • AfterTestMethodEvent

Spring solicita que los eventos beforeTestMethod y afterTestMethod se activen antes que otros callbacks de usuario, y que los eventos beforeTestExecution y afterTestExecution se activen después de otros callbacks de usuario. No es posible en Kotest definir el orden de los callbacks, pero intentamos seguir esta solicitud lo más fielmente posible.

Kotest ejecuta estos callbacks en los siguientes grupos, donde el orden entre grupos está garantizado, pero el orden dentro de cualquier grupo no está garantizado:

Grupo 1: BeforeTestMethodEvent de Spring y cualquier otro TestCaseExtension. Grupo 2: BeforeTestExecutionEvent de Spring y cualquier otro callback BeforeTest, BeforeAny y BeforeEach. Grupo 3: AfterTestExecutionEvent de Spring y cualquier otro callback AfterTest, AfterAny y AfterEach. Grupo 4: AfterTestMethodEvent de Spring y cualquier otro TestCaseExtension.

Clases finales

Al usar una clase final, puedes recibir una advertencia de Kotest:

Using SpringExtension 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.