Pruebas en Kotlin: revisión completa de frameworks y herramientas
Kotlin es un lenguaje que está ganando popularidad rápidamente en el desarrollo backend (Spring Boot, Ktor) y Android. Sin embargo, un lenguaje potente requiere herramientas de prueba adecuadas. En este artículo, analizaremos los frameworks y bibliotecas clave para probar aplicaciones Kotlin: desde el clásico JUnit5 hasta los modernos Kotest y MockK. El material será útil tanto para principiantes como para desarrolladores experimentados que migran desde Java.
1. JUnit5 — la base de las pruebas modernas
JUnit5 (Jupiter) es el estándar de facto para pruebas unitarias en Java/Kotlin. En Kotlin se utiliza con características pequeñas pero importantes.
- Soporte para lambdas y funciones de orden superior — las pruebas se pueden escribir de forma más concisa.
- Anotaciones —
@Test,@BeforeEach,@AfterAllfuncionan como en Java. - Assumptions y Assertions — verificaciones integradas.
Ejemplo de una prueba simple con JUnit5 y Kotlin:
import org.junit.jupiter.api.Assertions.assertEqualsimport org.junit.jupiter.api.Test
class CalculatorTest {
private val calculator = Calculator()
@Test fun `addition of two numbers should return correct sum`() { val result = calculator.add(2, 3) assertEquals(5, result) }
@Test fun `should throw exception when dividing by zero`() { assertThrows<IllegalArgumentException> { calculator.divide(10, 0) } }}Importante: Kotlin permite usar espacios en los nombres de las funciones de prueba (backticks), lo que hace que los nombres de las pruebas sean legibles en lenguaje natural.
2. Kotest — framework nativo de Kotlin
Kotest (anteriormente KotlinTest) es el framework más completo y flexible, completamente escrito en Kotlin. Ofrece varios estilos para escribir pruebas (estilo cadena, especificación, comportamiento) y potentes matchers integrados.
Características clave:
- Property-based testing — generación automática de datos de prueba.
- Pruebas basadas en datos — con tablas de datos de entrada.
- Potentes matchers de aserción —
shouldBe,shouldContain,shouldThrowy otros. - Soporte para Coroutines —
testCoroutineScopeintegrado.
Ejemplo de prueba en estilo "String Spec":
import io.kotest.core.spec.style.StringSpecimport io.kotest.matchers.shouldBeimport io.kotest.matchers.shouldThrow
class UserServiceTest : StringSpec({
val service = UserService()
"should return user by id" { val user = service.getUser(1) user.name shouldBe "Alice" }
"should throw exception for invalid id" { shouldThrow<NoSuchElementException> { service.getUser(-1) } }})Property-based testing en Kotest:
import io.kotest.property.forAllimport io.kotest.property.arbitrary.int
class MathPropertiesTest : StringSpec({ "addition is commutative" { forAll<Int, Int> { a, b -> (a + b) == (b + a) } }})3. MockK — mocks para Kotlin
A diferencia de Mockito (que también se puede usar), MockK está completamente adaptado a las particularidades de Kotlin: soporta sealed classes, object, extension functions y coroutines.
Características principales:
- DSL conciso para crear mocks y stubs.
- Soporte para mocks relax (llamadas no verificadas).
- Verificación del orden de llamadas y número de llamadas.
- Mocks para funciones
suspend.
También en la biblioteca
Cliente Redis para C# (.NET): StackExchange.Redis — conexión y ejemplos
Registro para Swift (iOS/macOS): mejores soluciones
Generación de códigos QR en Java: biblioteca ZXing (guía detallada)