Skip to content

Crash with JUnit 5.14 due to TestPlan internal API breaking change #390

@TWiStErRob

Description

@TWiStErRob

I see you've just updated to JUnit 5.14, but haven't really changed anything other than the dep.

I'm getting this crash on JUnit 5.13 to 5.14 update (keeping your lib 1.8):

java.lang.NoSuchMethodError: No direct method (ZLorg/junit/platform/engine/ConfigurationParameters;Lorg/junit/platform/engine/reporting/OutputDirectoryProvider;)V in class Lorg/junit/platform/launcher/TestPlan; or its super classes (declaration of 'org.junit.platform.launcher.TestPlan' appears in /data/app/net.twisterrob.colorfilters.android.base.test-12STHJQGEsmSwg_I_QSkWg==/base.apk!classes5.dex)

java.lang.NoSuchMethodError: No direct method <init>(ZLorg/junit/platform/engine/ConfigurationParameters;Lorg/junit/platform/engine/reporting/OutputDirectoryProvider;)V in class Lorg/junit/platform/launcher/TestPlan; or its super classes (declaration of 'org.junit.platform.launcher.TestPlan' appears in /data/app/net.twisterrob.colorfilters.android.base.test-12STHJQGEsmSwg_I_QSkWg==/base.apk!classes5.dex)
at de.mannodermaus.junit5.internal.runners.AndroidJUnitPlatformTestTree$ModifiedTestPlan.<init>(AndroidJUnitPlatformTestTree.kt:184)
at de.mannodermaus.junit5.internal.runners.AndroidJUnitPlatformTestTree.<init>(AndroidJUnitPlatformTestTree.kt:33)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.generateTestTree(AndroidJUnit5.kt:74)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.testTree_delegate$lambda$0(AndroidJUnit5.kt:30)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.$r8$lambda$KSfagmfVkPVu2wrnBs3DKovzKK4(Unknown Source:0)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:86)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.getTestTree(AndroidJUnit5.kt:30)
at de.mannodermaus.junit5.internal.runners.AndroidJUnit5.getDescription(AndroidJUnit5.kt:32)
at de.mannodermaus.junit5.internal.runners.JUnit5RunnerFactoryKt.hasExecutableTests(JUnit5RunnerFactory.kt:32)
at de.mannodermaus.junit5.internal.runners.JUnit5RunnerFactoryKt.tryCreateJUnit5Runner(JUnit5RunnerFactory.kt:28)
at de.mannodermaus.junit5.AndroidJUnit5Builder.runnerForClass(AndroidJUnit5Builder.kt:70)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at androidx.test.internal.runner.AndroidRunnerBuilder.runnerForClass(AndroidRunnerBuilder.java:146)
at androidx.test.internal.runner.ScanningTestLoader.doCreateRunner(ScanningTestLoader.java:50)
at androidx.test.internal.runner.TestLoader.getRunnersFor(TestLoader.java:64)
at androidx.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:842)
at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:672)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:453)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189)

Version Catalog: https://github.com/TWiStErRob/net.twisterrob.colorfilters/blob/5bf271cc162aa69dc1ccf65a2d17acc23d0455fd/gradle/libs.versions.toml
Reference: https://github.com/TWiStErRob/net.twisterrob.colorfilters/blob/5bf271cc162aa69dc1ccf65a2d17acc23d0455fd/component/test-base-ui/build.gradle#L40
Failed CI: https://github.com/TWiStErRob/net.twisterrob.colorfilters/actions/runs/18140714173/job/51630654198?pr=474
Test report: https://github.com/TWiStErRob/net.twisterrob.colorfilters/pull/474/checks?check_run_id=51631156586
Build scan: https://scans.gradle.com/s/krkvqoazfjik2

I wonder if I'm missing something, or there's an actual breakage your CI didn't pick up?

Crash pointing to

private class ModifiedTestPlan(val delegate: TestPlan) :
TestPlan(
/* containsTests = */ delegate.containsTests(),
/* configurationParameters = */ delegate.configurationParameters,
/* outputDirectoryProvider = */ delegate.outputDirectoryProvider
) {

Breakage caused by

junit-team/junit-framework@d1335cd#diff-9f26cdfdb6e74804dd2eddb0eb902ed4b0391e67b972c1dde3e630b8ff41e293R101 (TestPlan.java#101)

My guess is that a recompilation on your side will make android-junit5 1.9.0 incompatible with JUnit <5.14, because

-public interface OutputDirectoryProvider {
+public interface OutputDirectoryProvider extends OutputDirectoryCreator {

means that the new bytecode will bind to the new constructor and a similar (but opposite) exception to the above will throw on earlier versions.

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions