Regular unit tests fail with 2.5.0

Tool Version
Gradle 8.12.1
IntelliJ Platform Gradle Plugin 2.5.0

Upgrading from 2.3.0 to 2.5.0, junit tests fail with this exception.
we don’t use intellij test framework at all in this plugin and there is no mention of it anywhere.
we use useJUnitJupiter()

org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not start Gradle Test Executor 23.
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.startProcessing(SuiteTestClassProcessor.java:45)
	at java.base@21.0.6/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base@21.0.6/java.lang.reflect.Method.invoke(Method.java:580)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92)
	at jdk.proxy1/jdk.proxy1.$Proxy4.startProcessing(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$1.run(TestWorker.java:168)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: java.lang.NoClassDefFoundError: org/junit/rules/TestRule
	at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3549)
	at java.base/java.lang.Class.getConstructor0(Class.java:3754)
	at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2930)
	at com.intellij.openapi.diagnostic.Logger.setFactory(Logger.java:71)
	at com.intellij.testFramework.common.TestEnvironmentKt.initializeTestEnvironment(testEnvironment.kt:31)
	at com.intellij.testFramework.junit5.impl.JUnit5TestEnvironmentInitializer.launcherSessionOpened(JUnit5TestEnvironmentInitializer.kt:15)
	at org.junit.platform.launcher.core.DefaultLauncherSession.<init>(DefaultLauncherSession.java:60)
	at org.junit.platform.launcher.core.LauncherFactory.openSession(LauncherFactory.java:100)
	at org.junit.platform.launcher.core.LauncherFactory.openSession(LauncherFactory.java:82)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$BackwardsCompatibleLauncherSession.open(JUnitPlatformTestClassProcessor.java:323)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.createTestExecutor(JUnitPlatformTestClassProcessor.java:86)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.startProcessing(AbstractJUnitTestClassProcessor.java:44)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.startProcessing(SuiteTestClassProcessor.java:43)
	... 16 more
Caused by: java.lang.ClassNotFoundException: org.junit.rules.TestRule
	at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:235)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	... 30 more

org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'org.digma.intellij.plugin.ui.jcef.persistence.JCEFPersistenceStateTests'.
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:55)
	at java.base@21.0.6/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base@21.0.6/java.lang.reflect.Method.invoke(Method.java:580)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92)
	at jdk.proxy1/jdk.proxy1.$Proxy4.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:183)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: java.lang.NullPointerException: Cannot invoke "org.gradle.api.Action.execute(Object)" because "this.executor" is null
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:54)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53)
	... 16 more
1 Like

Caused by: java.lang.NoClassDefFoundError: org/junit/rules/TestRule isn’t that coming from JUnit itself? Not sure how Gradle plugin would interfere with these dependencies, especially if you don’t use any of the provided test frameworks.

Another point, Gradle 8.12.1 is not supported in 2.5.0, minimum Gradle version is 8.5 now

i understand. but its a fact that up to 2.3.0 there was no issue. i’m using the same build scripts for long time without any changes.
I’ll try to upgrade gradle and see if it solves the issue

actually my gradle version is 8.12.1 which satisfies the minimum 8.5

1 Like

IMO intellij does interfere with unit tests, i don’t understand why, these are just regular junit tests

com.intellij.testFramework.junit5.impl.JUnit5TestEnvironmentInitializer.launcherSessionOpened(JUnit5TestEnvironmentInitializer.kt:15)

Caused by: java.lang.NoClassDefFoundError: org/junit/rules/TestRule
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3549)
at java.base/java.lang.Class.getConstructor0(Class.java:3754)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2930)
at com.intellij.openapi.diagnostic.Logger.setFactory(Logger.java:71)
at com.intellij.testFramework.common.TestEnvironmentKt.initializeTestEnvironment(testEnvironment.kt:31)
at com.intellij.testFramework.junit5.impl.JUnit5TestEnvironmentInitializer.launcherSessionOpened(JUnit5TestEnvironmentInitializer.kt:15)
at org.junit.platform.launcher.core.DefaultLauncherSession.(DefaultLauncherSession.java:60)

1 Like

com.intellij.testFramework.junit5.impl.JUnit5TestEnvironmentInitializer comes from IJ Platform testframework. Could you please check in your project how this dependency ended up in your test classpath?

this is the testRuntimeClasspath, there is no dependency to IJ test framework

yet in the stacktrace we see com.intellij.testFramework.junit5.impl.JUnit5TestEnvironmentInitializer

It happens only when building with IJ 243 and 251, with earlier versions there is no problem. we build the exact same project only change the platform version

testRuntimeClasspath - Runtime classpath of 'test'.
+--- org.apache.commons:commons-lang3:3.12.0
+--- org.freemarker:freemarker:2.3.30
+--- com.squareup.okhttp3:okhttp:3.14.9
|    \--- com.squareup.okio:okio:1.17.2
+--- project :model
|    \--- org.ocpsoft.prettytime:prettytime:5.0.3.Final
+--- project :analytics-provider
|    +--- project :model (*)
|    +--- com.squareup.retrofit2:retrofit:2.9.0
|    |    \--- com.squareup.okhttp3:okhttp:3.14.9 (*)
|    +--- com.squareup.retrofit2:converter-jackson:2.9.0
|    |    +--- com.squareup.retrofit2:retrofit:2.9.0 (*)
|    |    \--- com.fasterxml.jackson.core:jackson-databind:2.10.1 -> 2.10.5.1
|    |         +--- com.fasterxml.jackson.core:jackson-annotations:2.10.5
|    |         \--- com.fasterxml.jackson.core:jackson-core:2.10.5
|    +--- com.squareup.retrofit2:converter-scalars:2.9.0
|    |    \--- com.squareup.retrofit2:retrofit:2.9.0 (*)
|    +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.5
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.10.5
|    |    +--- com.fasterxml.jackson.core:jackson-core:2.10.5
|    |    \--- com.fasterxml.jackson.core:jackson-databind:2.10.5 -> 2.10.5.1 (*)
|    +--- com.google.guava:guava:31.1-jre
|    |    +--- com.google.guava:failureaccess:1.0.1
|    |    +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
|    |    +--- com.google.code.findbugs:jsr305:3.0.2
|    |    +--- org.checkerframework:checker-qual:3.12.0
|    |    +--- com.google.errorprone:error_prone_annotations:2.11.0
|    |    \--- com.google.j2objc:j2objc-annotations:1.3
|    +--- org.apache.commons:commons-lang3:3.12.0
|    \--- com.squareup.okhttp3:logging-interceptor:3.14.9
+--- project :ide-common
|    +--- org.threeten:threeten-extra:1.7.0
|    +--- org.apache.commons:commons-lang3:3.12.0
|    +--- org.apache.commons:commons-collections4:4.4
|    +--- commons-validator:commons-validator:1.9.0
|    |    +--- commons-beanutils:commons-beanutils:1.9.4
|    |    |    +--- commons-logging:commons-logging:1.2 -> 1.3.2
|    |    |    \--- commons-collections:commons-collections:3.2.2
|    |    +--- commons-digester:commons-digester:2.1
|    |    +--- commons-logging:commons-logging:1.3.2
|    |    \--- commons-collections:commons-collections:3.2.2
|    +--- com.posthog.java:posthog:1.1.0
|    +--- org.apache.maven:maven-artifact:3.9.2
|    |    +--- org.codehaus.plexus:plexus-utils:3.5.1
|    |    \--- org.apache.commons:commons-lang3:3.12.0
|    +--- com.glovoapp.gradle:versioning:1.1.10
|    +--- net.bytebuddy:byte-buddy:1.14.13
|    +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.5 (*)
|    +--- project :model (*)
|    \--- project :analytics-provider (*)
+--- project :jvm-common
+--- project :gradle-support
+--- project :maven-support
+--- project :rider
|    +--- org.apache.commons:commons-collections4:4.4
|    \--- org.apache.commons:commons-lang3:3.12.0
+--- project :kotlin
+--- bundledModule:intellij.platform.collaborationTools:IC-251.23774.200
+--- com.jetbrains.intellij.idea:ideaIC:251.23774.200-EAP-SNAPSHOT
+--- root project : (*)
+--- org.jetbrains.kotlin:kotlin-test -> 2.1.10
|    +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.10
|    |    \--- org.jetbrains:annotations:13.0
|    \--- org.jetbrains.kotlin:kotlin-test-junit5:2.1.10
|         +--- org.jetbrains.kotlin:kotlin-test:2.1.10 (*)
|         +--- org.junit.jupiter:junit-jupiter-engine:5.10.1
|         |    +--- org.junit:junit-bom:5.10.1
|         |    |    +--- org.junit.jupiter:junit-jupiter:5.10.1 (c)
|         |    |    +--- org.junit.jupiter:junit-jupiter-api:5.10.1 (c)
|         |    |    +--- org.junit.jupiter:junit-jupiter-engine:5.10.1 (c)
|         |    |    +--- org.junit.platform:junit-platform-engine:1.10.1 (c)
|         |    |    +--- org.junit.platform:junit-platform-launcher:1.10.1 (c)
|         |    |    +--- org.junit.platform:junit-platform-commons:1.10.1 (c)
|         |    |    \--- org.junit.jupiter:junit-jupiter-params:5.10.1 (c)
|         |    +--- org.junit.platform:junit-platform-engine:1.10.1
|         |    |    +--- org.junit:junit-bom:5.10.1 (*)
|         |    |    +--- org.opentest4j:opentest4j:1.3.0
|         |    |    \--- org.junit.platform:junit-platform-commons:1.10.1
|         |    |         \--- org.junit:junit-bom:5.10.1 (*)
|         |    \--- org.junit.jupiter:junit-jupiter-api:5.10.1
|         |         +--- org.junit:junit-bom:5.10.1 (*)
|         |         +--- org.opentest4j:opentest4j:1.3.0
|         |         \--- org.junit.platform:junit-platform-commons:1.10.1 (*)
|         \--- org.junit.platform:junit-platform-launcher:1.10.1
|              +--- org.junit:junit-bom:5.10.1 (*)
|              \--- org.junit.platform:junit-platform-engine:1.10.1 (*)
+--- org.junit.jupiter:junit-jupiter:5.8.2 -> 5.10.1
|    +--- org.junit:junit-bom:5.10.1 (*)
|    +--- org.junit.jupiter:junit-jupiter-api:5.10.1 (*)
|    +--- org.junit.jupiter:junit-jupiter-params:5.10.1
|    |    +--- org.junit:junit-bom:5.10.1 (*)
|    |    \--- org.junit.jupiter:junit-jupiter-api:5.10.1 (*)
|    \--- org.junit.jupiter:junit-jupiter-engine:5.10.1 (*)
+--- org.jetbrains.kotlin:kotlin-test:2.1.10 (*)
+--- org.jetbrains.kotlin:kotlin-test:2.1.10 (c)
\--- org.junit.platform:junit-platform-launcher -> 1.10.1 (*)

I don’t understand this workaround, i’m not using junit 4 , i’m using junit 5.
i tried anyway to add juni 4 dependency and tried junit 5 and nothing helps.

I don’t understand why IJ interferes with regular unit tests with

at com.intellij.testFramework.common.TestEnvironmentKt.initializeTestEnvironment(testEnvironment.kt:31)
at com.intellij.testFramework.junit5.impl.JUnit5TestEnvironmentInitializer.launcherSessionOpened(JUnit5TestEnvironmentInitializer.kt:15)

This is because test classes exported as TF JUnit5 accidentally refer to JUnit4 engine, which is not mentioned as a transitive dependency – this was fixed in the later releases, but to get those working you have to satisfy that dependency.

1 Like

didn’t help, same thing

testRuntimeOnly - Runtime only dependencies for ‘test’. (n)
-– junit:junit:4.13.2 (n)

and i see it in testRuntimeClasspath
±-- junit:junit:4.13.2
| -– org.hamcrest:hamcrest-core:1.3

unfortunately i don’t have time to continue investigating it this week , i will get back to it next week with more time to dig into it.

Thank you for your help in the meantime

Are tests failing at runtime or earlier during compilation?

at runtime. compilation passes

I had this same problem and I ended up moving all my code that was in the core layer, including their unit tests, to a different gradle project.

I noticed too that there was an accidental dependency on JUnit4 without a specified transitive dependency in the maven artifacts and manifest.