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 que usa Spring WebFlux aquí
Para usar esta extensión, debes añadir el módulo io.kotest.extensions: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: El group id de Maven difiere del framework de pruebas principal (io.kotest.extensions).
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:
class ProjectConfig : AbstractProjectConfig() {
override fun extensions() = listOf(SpringExtension)
}
Para activarla por clase de prueba:
class MyTestSpec : FunSpec() {
override fun extensions() = listOf(SpringExtension)
}
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
cuando se añade 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 fun extensions() = listOf(SpringTestExtension(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.