Search code examples
kotlingradlekotlintestkotest

Kotest setup issue, 'unresolved reference'


I am trying to add kotest to my library, but am just getting:

e: /home/brett/git/ttnt/src/test/kotlin/io/bmb/ttnt/lib/SqliteManagerTest.kt: (3, 18): Unresolved reference: specs
e: /home/brett/git/ttnt/src/test/kotlin/io/bmb/ttnt/lib/SqliteManagerTest.kt: (4, 18): Unresolved reference: shouldBe
e: /home/brett/git/ttnt/src/test/kotlin/io/bmb/ttnt/lib/SqliteManagerTest.kt: (6, 27): Unresolved reference: StringSpec
e: /home/brett/git/ttnt/src/test/kotlin/io/bmb/ttnt/lib/SqliteManagerTest.kt: (8, 9): Expression '"canary test should pass"' of type 'String' cannot be invoked as a function. The function 'invoke()' is not found
e: /home/brett/git/ttnt/src/test/kotlin/io/bmb/ttnt/lib/SqliteManagerTest.kt: (9, 18): Unresolved reference: shouldBe

I must be messing up somewhere in my build.gradle.kts, and something isn't loading or useJUnitPlatform() is not running, but i'm not sure where. Can anyone spot where I have gone wrong?

src/test/kotlin/io/bmb/ttnt/lib/SqliteManagerTest.kt

package io.bmb.ttnt.lib

import io.kotest.specs.StringSpec
import io.kotest.shouldBe

class SqliteManagerTest : StringSpec() {
    init {
        "canary test should pass" {
            true shouldBe true
        }
    }
}

build.gradle.kts:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath("com.github.jengelman.gradle.plugins:shadow:2.0.4")
    }
}

plugins {
    idea
    id("org.jetbrains.kotlin.jvm") version "1.3.71"
    id("org.jetbrains.kotlin.kapt") version "1.3.72"
    jacoco
    id("com.github.johnrengelman.shadow") version "5.2.0"
}



group = "io.bmb.ttnt"
version = "0.1-ALPHA"

repositories {
    google()
    mavenCentral()
    jcenter()
    maven {
        name="papermc"
        url=uri("https://papermc.io/repo/repository/maven-public/")
    }
    maven {
        url=uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots")
    }
    maven {
        url=uri("https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc")
    }
}


dependencies {
    compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    compileOnly("com.destroystokyo.paper:paper-api:1.14.4-R0.1-SNAPSHOT")
    compile("io.papermc:paperlib:1.0.3")

    compile(group="org.xerial", name="sqlite-jdbc", version="3.28.0")

    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7")
    testCompile("io.kotest:kotest-runner-junit5-jvm:4.0.6") // for kotest framework
    testCompile("io.kotest:kotest-assertions-core-jvm:4.0.6") // for kotest core jvm assertions
    testCompile("io.kotest:kotest-property-jvm:4.0.6") // for kotest property test
    testImplementation("io.mockk:mockk:1.10.0")
}

tasks.withType<ShadowJar> {
    baseName = "ttnt"
    classifier = "ALPHA"
    version = "0.1"
}

tasks.test {
    finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run
}

tasks.jacocoTestReport {
    dependsOn(tasks.test) // tests are required to run before generating the report
    reports {
        xml.isEnabled = false
        csv.isEnabled = false
        html.destination = file("${buildDir}/jacocoHtml")
    }
}

jacoco {
    toolVersion = "0.8.5"
    reportsDir = file("$buildDir/customJacocoReportDir")
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

idea {
    module {
        isDownloadJavadoc = true
        isDownloadSources = true
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

val compileKotlin: KotlinCompile by tasks
val compileTestKotlin: KotlinCompile by tasks

compileKotlin.kotlinOptions.jvmTarget = "1.8"
compileTestKotlin.kotlinOptions.jvmTarget = "1.8"

defaultTasks("clean", "test", "jacocoTestReport")

Update:

This works, though with deprecation warnings, if I use:

import io.kotlintest.specs.StringSpec
import io.kotlintest.shouldBe

Though io.kotest is what i used in the build.gradle.kts file?


Solution

  • StringSpec is now in the io.kotest.core.spec.style package, not io.kotest.specs.

    shouldBe is now in the io.kotest.matchers package, not io.kotest.

    If you remove both lines from your code, IntelliJ will likely suggest to use the new imports, but your code will look like this:

    package io.bmb.ttnt.lib
    
    import io.kotest.core.spec.style.StringSpec
    import io.kotest.matchers.shouldBe
    
    class SqliteManagerTest : StringSpec() {
        init {
            "canary test should pass" {
                true shouldBe true
            }
        }
    }