Невозможно запустить стартовый тест Spek в приложении Ktor

Я использую IntellJ версии 2017.2.5 для создания приложения Ktor. Я также хочу использовать Spek для тестирования приложения. Я начал с очень простого, взятого из документации:

import org.jetbrains.spek.api.Spek
import org.jetbrains.spek.api.dsl.given
import org.jetbrains.spek.api.dsl.it
import org.jetbrains.spek.api.dsl.on
import kotlin.test.assertEquals

class SampleSpec : Spek({
    given("some context") {
        on("executing some action") {
            it("should pass") {
                assertEquals(2, 2)
            }
        }
    }
})

Когда я щелкаю правой кнопкой мыши, чтобы запустить тест, я получаю следующую ошибку:

Feb 08, 2018 2:50:32 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'spek' failed to discover tests
java.lang.NoClassDefFoundError: org/junit/platform/engine/discovery/ClasspathSelector
    at org.jetbrains.spek.engine.SpekTestEngine.resolveSpecs(SpekTestEngine.kt:48)
    at org.jetbrains.spek.engine.SpekTestEngine.discover(SpekTestEngine.kt:36)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:130)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:117)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at org.jetbrains.spek.tooling.runner.junit.JUnitPlatformSpekRunner.run(JUnitPlatformSpekRunner.kt:107)
    at org.jetbrains.spek.tooling.MainKt.main(Main.kt:58)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.discovery.ClasspathSelector
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Извините за длительный build.gradle, но вот он:

group 'MyApp'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.21'
    ext.ktor_version = '0.9.1'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        //testing
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M4'
        testCompile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
        testCompile ('org.jetbrains.spek:spek-api:1.1.5') {
            exclude group: 'org.jetbrains.kotlin'
        }
        testRuntime ('org.jetbrains.spek:spek-junit-platform-engine:1.1.5') {
            exclude group: 'org.junit.platform'
            exclude group: 'org.jetbrains.kotlin'
        }
    }
}

//testing
apply plugin: 'org.junit.platform.gradle.plugin'
apply plugin: 'java'
apply plugin: 'kotlin'

junitPlatform {
    platformVersion '1.0.0-M4'
    filters {
        engines {
            include 'spek'
        }
    }
}
sourceCompatibility = 1.8

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

kotlin {
    experimental {
        coroutines "enable"
    }
}

repositories {
    mavenCentral()
    maven { url "https://dl.bintray.com/kotlin/kotlinx" }
    maven { url "https://dl.bintray.com/kotlin/ktor" }
    maven { url "https://dl.bintray.com/jetbrains/spek" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    //testing
    testCompile 'org.jetbrains.kotlin:kotlin-test:1.1.0'
    testCompile 'org.jetbrains.spek:spek-api:1.1.4'
    testCompile 'org.jetbrains.spek:spek-junit-platform-engine:1.0.89'
    testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.0.0-M4'
}

Есть идеи, где проблема?

1 ответ

Решение

Вы используете несовместимые версии платформ Spek и Junit. Вы должны обновить, чтобы использовать версии, рекомендованные в документации Spek: http://spekframework.org/docs/latest/

Я обновил ваш пример для использования Spek 1.1.5 и Junit Platform 1.0.0

group 'MyApp'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.21'
    ext.ktor_version = '0.9.1'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
    }
}

//testing
apply plugin: 'org.junit.platform.gradle.plugin'
apply plugin: 'java'
apply plugin: 'kotlin'

junitPlatform {
    filters {
        engines {
            include 'spek'
        }
    }
}
sourceCompatibility = 1.8

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

kotlin {
    experimental {
        coroutines "enable"
    }
}

repositories {
    mavenCentral()
    maven { url "https://dl.bintray.com/kotlin/kotlinx" }
    maven { url "https://dl.bintray.com/kotlin/ktor" }
    maven { url "https://dl.bintray.com/jetbrains/spek" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    //testing
    testCompile 'org.jetbrains.kotlin:kotlin-test:1.1.0'
    testCompile 'org.jetbrains.spek:spek-api:1.1.5'
    testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
    testRuntime 'org.junit.platform:junit-platform-launcher:1.0.0'
}

Я также нашел полезным включить testRuntime 'org.junit.platform:junit-platform-launcher:1.0.0' чтобы плагин IntelliJ использовал правильную версию Junit.

Другие вопросы по тегам