Jenga Voor deze blog post gebruik ik een side project als basis: een implementatie van het populaire bordspel Hoogspanning (PowerGrid) geschreven in Kotlin.

Spek

Tests zijn feitelijk je specificaties en de documentatie van de systeem. Bij unit tests die geschreven zijn voor bijvoorbeeld JUnit is het vaak lastig om te zien wat precies de gegeven situatie is en wat het verwachte resultaat is.

En natuurlijk willen we bij een Kotlin project ook een testoplossing die past bij Kotlin! Daar komt Spek om de hoek kijken. Spek heeft een eigen DSL die deze aspecten van tests expliciet maakt. Een beetje vergelijkbaar met frameworks als Spock voor Groovy of Jasmine voor JavaScript.

Dependencies

Voeg Spek toe aan je Gradle project:

buildscript {
    repositories {
        // ...
        maven { url "http://dl.bintray.com/jetbrains/spek" }
    }

    dependencies {
        // ...
        classpath("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3")
    }
}

apply plugin: 'org.junit.platform.gradle.plugin'

junitPlatform {
    filters {
        engines {
            include 'spek'
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // ...

    testCompile("org.jetbrains.kotlin:kotlin-test:${kotlinVersion}")

    testCompile('org.jetbrains.spek:spek-api:1.1.0')
    testRuntime('org.jetbrains.spek:spek-junit-platform-engine:1.1.0')
}

Heb je een Maven project? Daar is ook een plugin voor beschikbaar.

Installeer ook de Spek plugin voor IntelliJ IDEA om de tests vanuit de IDE te kunnen draaien.

Tests schrijven in Spek

Een specificatie voor de class PowerGrid zou er bijvoorbeeld zo uit kunnen zien:

object PowerGridSpec : Spek({

    // ...

    describe("PowerGrid") {
        val powerGrid = PowerGrid(random, players, map)

        it("should start in step 1") {
            assertEquals(1, powerGrid.step)
        }

        it("should start in round 1") {
            assertEquals(1, powerGrid.round)
        }

        it("should give players initial balance") {
            players.forEach { player -> assertEquals(50, powerGrid.playerStates[player]!!.balance) }
        }
    }
})

Lees er meer over op: http://spekframework.org/.