Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Spek fails to discover tests on Java 9, 10, 11, 12 #707

Closed
AlyoshaVasilieva opened this issue May 20, 2019 · 7 comments
Closed

Spek fails to discover tests on Java 9, 10, 11, 12 #707

AlyoshaVasilieva opened this issue May 20, 2019 · 7 comments

Comments

@AlyoshaVasilieva
Copy link

AlyoshaVasilieva commented May 20, 2019

IntelliJ 2019.1.2, Gradle 5.4.1, Windows 10 x64.

Using this buildscript:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.3.31"
}

group = "su.slytherin"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    implementation(kotlin("reflect"))
    val spekVersion = "2.0.4"
    testImplementation("org.spekframework.spek2:spek-dsl-jvm:$spekVersion")
    testRuntimeOnly("org.spekframework.spek2:spek-runner-junit5:$spekVersion")
    testImplementation("io.kotlintest:kotlintest-runner-junit5:3.3.2")
    testRuntimeOnly("org.slf4j:slf4j-simple:1.7.26")
}

val test by tasks.getting(Test::class) {
    useJUnitPlatform {
        includeEngines("spek2")
    }
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

and this test code

import io.kotlintest.shouldBe
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe

object HelloWorld : Spek({
    describe("hello world") {
        it("equals") {
            "hello world".length shouldBe ("hello" + " " + "world").length
        }
    }
})

I receive the following test output (with very minor differences) on Java 9, 10, 11, and 12:

Testing started at 8:01 AM ...
8:01:22 AM: Executing task 'test'...

> Task :compileKotlin NO-SOURCE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestKotlin
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test
May 20, 2019 8:01:24 AM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'spek2' failed to discover tests
java.lang.annotation.AnnotationFormatError: java.lang.IllegalArgumentException: Wrong type at constant pool index
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:77)
	at java.base/java.lang.Class.createAnnotationData(Class.java:3730)
	at java.base/java.lang.Class.annotationData(Class.java:3719)
	at java.base/java.lang.Class.getDeclaredAnnotations(Class.java:3686)
	at kotlin.reflect.jvm.internal.components.ReflectClassStructure.loadClassAnnotations(ReflectKotlinClass.kt:85)
	at kotlin.reflect.jvm.internal.components.ReflectKotlinClass$Factory.create(ReflectKotlinClass.kt:57)
	at kotlin.reflect.jvm.internal.components.ReflectKotlinClassFinder.findKotlinClass(ReflectKotlinClassFinder.kt:28)
	at kotlin.reflect.jvm.internal.components.ReflectKotlinClassFinder.findKotlinClassOrContent(ReflectKotlinClassFinder.kt:31)
	at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaPackageScope$classes$1.invoke(LazyJavaPackageScope.kt:63)
	at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaPackageScope$classes$1.invoke(LazyJavaPackageScope.kt:43)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:440)
	at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaPackageScope.findClassifier(LazyJavaPackageScope.kt:145)
	at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaPackageScope.getContributedClassifier(LazyJavaPackageScope.kt:135)
	at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.JvmPackageScope.getContributedClassifier(JvmPackageScope.kt:52)
	at kotlin.reflect.jvm.internal.impl.resolve.scopes.ChainedMemberScope.getContributedClassifier(ChainedMemberScope.kt:33)
	at kotlin.reflect.jvm.internal.impl.resolve.scopes.AbstractScopeAdapter.getContributedClassifier(AbstractScopeAdapter.kt:44)
	at kotlin.reflect.jvm.internal.impl.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies(findClassInModule.kt:25)
	at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:51)
	at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:44)
	at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
	at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
	at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt)
	at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:179)
	at kotlin.reflect.jvm.internal.KClassImpl.isAbstract(KClassImpl.kt:268)
	at org.spekframework.spek2.runtime.JvmDiscoveryContextFactory.create(JvmDiscoveryContextFactory.kt:26)
	at org.spekframework.spek2.junit.SpekTestEngine.discover(SpekTestEngine.kt:91)
	at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:177)
	at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:164)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:102)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:82)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:78)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.IllegalArgumentException: Wrong type at constant pool index
	at java.base/jdk.internal.reflect.ConstantPool.getClassAt0(Native Method)
	at java.base/jdk.internal.reflect.ConstantPool.getClassAt(ConstantPool.java:37)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:244)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)
	... 57 more

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
8:01:24 AM: Task execution finished 'test'.

This code works fine on Java 8. Am I doing something wrong or is this a bug?

@raniejade
Copy link
Member

Really weird, can you check if you have conflicting versions of kotlin-reflect in the classpath?

@AlyoshaVasilieva
Copy link
Author

Classpath only has one kotlin-reflect, version 1.3.31 same as other Kotlin dependencies.

Swapping assertion system from io.kotlintest to org.junit.jupiter:junit-jupiter-api:5.3.2 'fixed' it, except now I'm using different assertion system. Does io.kotlintest:kotlintest-runner-junit5:3.3.2 work for you on Java 9+ or should I switch off it?

@raniejade
Copy link
Member

Hmmm, I have noticed kotlintest-runner-junit5 to caused issues when used with Spek before but never dug in any further. Current suspicion is that kotlintest pulls in an older version of classgraph which might not support Java 9+. Can you confirm what classgraph version is pulled in with and without io.kotlintest:kotlintest-runner-junit5:3.3.2.

@AlyoshaVasilieva
Copy link
Author

kotlintest pulls in io.github.classgraph:classgraph:4.8.1. Without it, org.spekframework.spek2:spek-runtime-jvm:2.0.5 pulls in io.github.classgraph:classgraph:4.0.6.

@raniejade
Copy link
Member

Can you try explicitly depending on io.github.classgraph:classgraph:4.8.1 instead of having it pulled transitively?

@AlyoshaVasilieva
Copy link
Author

AlyoshaVasilieva commented May 27, 2019

Using io.github.classgraph:classgraph:4.8.1 causes spek to fail on Java 9-12 with the same issue even while using JUnit Jupiter.

The last working version is 4.6.32. The next version, 4.8.0, does not work.

edit: I forgot to try an actually up-to-date version. Depending specifically on io.github.classgraph:classgraph:4.8.37 seems to work, even with kotlintest, on both my minimal repro code and my actual project.

Trying further versions, it seems 4.8.17 fixed whatever was broken. That version notes it fixes a problem regarding 'complex classloader environments'.

@raniejade
Copy link
Member

thanks @AlyoshaVasilieva for the investigation. Created #717 as a todo on Spek.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants