Testes em Kotlin: visão completa de frameworks e ferramentas
Kotlin — uma linguagem que está rapidamente ganhando popularidade no desenvolvimento backend (Spring Boot, Ktor) e Android. No entanto, uma linguagem poderosa requer ferramentas de teste adequadas. Neste artigo, abordaremos os principais frameworks e bibliotecas para testar aplicações Kotlin: desde o clássico JUnit5 até os modernos Kotest e MockK. O material será útil tanto para iniciantes quanto para desenvolvedores experientes migrando do Java.
1. JUnit5 — a base dos testes modernos
JUnit5 (Jupiter) é o padrão de facto para testes unitários em Java/Kotlin. Em Kotlin, ele é usado com pequenas, mas importantes, particularidades.
- Suporte a lambdas e funções de ordem superior — os testes podem ser escritos de forma mais concisa.
- Anotações —
@Test,@BeforeEach,@AfterAllfuncionam como em Java. - Assumptions e Assertions — verificações integradas.
Exemplo de um teste simples com JUnit5 e 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 espaços em nomes de funções de teste (com acentos graves), tornando os nomes dos testes legíveis em linguagem natural.
2. Kotest — framework nativo Kotlin
Kotest (anteriormente KotlinTest) é o framework mais completo e flexível, totalmente escrito em Kotlin. Ele oferece vários estilos de escrita de testes (string spec, spec, behavior) e poderosos matchers integrados.
Principais recursos:
- Property-based testing — geração automática de dados de teste.
- Testes orientados a dados — com tabelas de dados de entrada.
- Matchers de asserção poderosos —
shouldBe,shouldContain,shouldThrowe outros. - Suporte a Coroutines —
testCoroutineScopeintegrado.
Exemplo de teste no 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 no 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
Ao contrário do Mockito (que também pode ser usado), o MockK é totalmente adaptado às particularidades do Kotlin: suporta sealed classes, object, extension functions e coroutines.
Principais recursos:
- DSL conciso para criar mocks e stubs.
- Suporte a mocks relaxados (chamadas não verificadas).
- Verificação da ordem e número de chamadas.
- Mocks para funções
suspend.
Também na biblioteca
HtmlAgilityPack para C# (.NET): guia completo com exemplos
Trabalhando com CSV em C++: bibliotecas, parsing e escrita de dados
Symfony para PHP: guia completo com exemplos
Geração de PDF em TypeScript: bibliotecas, ferramentas e exemplos de código