Skip to content

Commit d7b48e9

Browse files
committed
Fix usage of TestPlan API in instrumentation tests to match binary-incompatible change in 5.12
1 parent 674114f commit d7b48e9

File tree

4 files changed

+50
-16
lines changed

4 files changed

+50
-16
lines changed

instrumentation/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ Change Log
33

44
## Unreleased
55

6+
- **This version requires (at least) android-junit5 1.12.0.0 and JUnit 5.12.0.**
7+
- Migrate to new TestPlan API in JUnit 5.12, which changed in a binary-incompatible fashion
8+
69
## 1.6.0 (2024-10-05)
710

811
- Use square brackets for parameterized tests to ensure that their logs show correctly in the IDE (#350)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package de.mannodermaus.junit5.internal.discovery
2+
3+
import androidx.annotation.RequiresApi
4+
import org.junit.platform.engine.ConfigurationParameters
5+
import org.junit.platform.engine.TestDescriptor
6+
import org.junit.platform.engine.reporting.OutputDirectoryProvider
7+
import org.junit.platform.launcher.TestPlan
8+
import java.io.File
9+
import java.util.Optional
10+
11+
/**
12+
* A JUnit TestPlan that does absolutely nothing.
13+
* Used by [de.mannodermaus.junit5.internal.runners.AndroidJUnit5] whenever a class
14+
* is not loadable through the JUnit Platform and should be discarded.
15+
*/
16+
@RequiresApi(26)
17+
internal object EmptyTestPlan : TestPlan(
18+
false,
19+
emptyConfigurationParameters,
20+
emptyOutputDirectoryProvider
21+
)
22+
23+
@RequiresApi(26)
24+
private val emptyConfigurationParameters = object : ConfigurationParameters {
25+
override fun get(key: String?) = Optional.empty<String>()
26+
override fun getBoolean(key: String?) = Optional.empty<Boolean>()
27+
override fun keySet() = emptySet<String>()
28+
29+
@Deprecated("Deprecated in Java", ReplaceWith("keySet().size"))
30+
override fun size() = 0
31+
}
32+
33+
@RequiresApi(26)
34+
private val emptyOutputDirectoryProvider = object : OutputDirectoryProvider {
35+
private val path = File.createTempFile("empty-output", ".nop").toPath()
36+
override fun getRootDirectory() = path
37+
override fun createOutputDirectory(testDescriptor: TestDescriptor?) = path
38+
}

instrumentation/runner/src/main/kotlin/de/mannodermaus/junit5/internal/runners/AndroidJUnit5.kt

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package de.mannodermaus.junit5.internal.runners
22

33
import androidx.annotation.RequiresApi
44
import androidx.annotation.VisibleForTesting
5+
import de.mannodermaus.junit5.internal.discovery.EmptyTestPlan
56
import de.mannodermaus.junit5.internal.runners.notification.ParallelRunNotifier
67
import org.junit.platform.commons.JUnitException
78
import org.junit.platform.engine.ConfigurationParameters
@@ -25,19 +26,6 @@ internal class AndroidJUnit5(
2526
private val testClass: Class<*>,
2627
paramsSupplier: () -> AndroidJUnit5RunnerParams = AndroidJUnit5RunnerParams.Companion::create,
2728
) : Runner() {
28-
private companion object {
29-
private val emptyConfigurationParameters = object : ConfigurationParameters {
30-
override fun get(key: String?) = Optional.empty<String>()
31-
override fun getBoolean(key: String?) = Optional.empty<Boolean>()
32-
override fun keySet() = emptySet<String>()
33-
34-
@Deprecated("Deprecated in Java", ReplaceWith("keySet().size"))
35-
override fun size() = 0
36-
}
37-
38-
private val emptyTestPlan = TestPlan.from(emptyList(), emptyConfigurationParameters)
39-
}
40-
4129
private val launcher = LauncherFactory.create()
4230
private val testTree by lazy { generateTestTree(paramsSupplier()) }
4331

@@ -80,7 +68,7 @@ internal class AndroidJUnit5(
8068
// or anything else not present in the Android runtime).
8169
// Log those to console, but discard them from being considered at all
8270
e.printStackTrace()
83-
emptyTestPlan
71+
EmptyTestPlan
8472
}
8573

8674
return AndroidJUnitPlatformTestTree(

instrumentation/runner/src/main/kotlin/de/mannodermaus/junit5/internal/runners/AndroidJUnitPlatformTestTree.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ internal class AndroidJUnitPlatformTestTree(
137137

138138
return if (identifier.isTest || identifier.isDynamicTest) {
139139
Description.createTestDescription(
140-
/* className = */ testPlan.getParent(identifier)
140+
/* className = */
141+
testPlan.getParent(identifier)
141142
.map(nameExtractor)
142143
.orElse("<unrooted>"),
143144
/* name = */ name,
@@ -180,7 +181,11 @@ internal class AndroidJUnitPlatformTestTree(
180181
* Custom drop-in TestPlan for Android purposes.
181182
*/
182183
private class ModifiedTestPlan(val delegate: TestPlan) :
183-
TestPlan(delegate.containsTests(), delegate.configurationParameters) {
184+
TestPlan(
185+
/* containsTests = */ delegate.containsTests(),
186+
/* configurationParameters = */ delegate.configurationParameters,
187+
/* outputDirectoryProvider = */ delegate.outputDirectoryProvider
188+
) {
184189

185190
fun getRealParent(child: TestIdentifier?): Optional<TestIdentifier> {
186191
// Because the overridden "getParent()" from the superclass is modified,

0 commit comments

Comments
 (0)