When applying the java-test-fixtures plugin to a project, classes from sourceSets.main are put onto the test classpath twice, which imho might be a bug in gradle's handling of test-fixtures.
gradlew test --tests at.myorg.testfixtures.MyTest.classesFromMainSourceSetArePresentMultipleTimes yields
file:/.../testfixtures/build/classes/java/main/at/myorg/testfixtures/App.classjar:file:/.../testfixtures/build/libs/testfixtures.jar!/at/myorg/testfixtures/App.class
while only
file:/.../testfixtures/build/classes/java/main/at/myorg/testfixtures/App.class
is expected.
Notice, that the project itself is present on the dependency tree twice:
gradlew dependencies --configuration testRuntimeClasspath > Task :dependencies ------------------------------------------------------------ Root project ------------------------------------------------------------ testRuntimeClasspath - Runtime classpath of source set 'test'. +--- project : (*) +--- org.junit.jupiter:junit-jupiter-api:5.5.2 | +--- org.apiguardian:apiguardian-api:1.1.0 | +--- org.opentest4j:opentest4j:1.2.0 | \--- org.junit.platform:junit-platform-commons:1.5.2 | \--- org.apiguardian:apiguardian-api:1.1.0 +--- org.junit.jupiter:junit-jupiter-engine:5.5.2 | +--- org.apiguardian:apiguardian-api:1.1.0 | +--- org.junit.platform:junit-platform-engine:1.5.2 | | +--- org.apiguardian:apiguardian-api:1.1.0 | | +--- org.opentest4j:opentest4j:1.2.0 | | \--- org.junit.platform:junit-platform-commons:1.5.2 (*) | \--- org.junit.jupiter:junit-jupiter-api:5.5.2 (*) \--- project : (*) (*) - dependencies omitted (listed previously) A web-based, searchable dependency report is available by adding the --scan option.
The result of dependencyInsight are as follows:
gradlew dependencyInsight --dependency testfixtures --configuration testRuntimeClasspath
> Task :dependencyInsight
project :
variant "testRuntimeClasspath" [
org.gradle.usage = java-runtime
org.gradle.libraryelements = jar
org.gradle.dependency.bundling = external
org.gradle.jvm.version = 8
]
variant "testFixturesRuntimeElements" [
org.gradle.usage = java-runtime
org.gradle.libraryelements = jar
org.gradle.dependency.bundling = external
org.gradle.category = library (not requested)
org.gradle.jvm.version = 8
]
variant "runtimeElements" [
org.gradle.usage = java-runtime
org.gradle.libraryelements = jar
org.gradle.dependency.bundling = external
org.gradle.category = library (not requested)
org.gradle.jvm.version = 8
]
project :
\--- project : (*)
project :
\--- project : (*)
(*) - dependencies omitted (listed previously)
A web-based, searchable dependency report is available by adding the --scan option.
Removing the java-test-fixtures plugin from the project (and moving all sources from src/testFixtures into src/test to
avoid compile errors) makes the jar:file:...
classpath resource disappear. Also, the dependency tree looks more familiar:
gradlew dependencies --configuration testRuntimeClasspath
> Task :dependencies
------------------------------------------------------------
Root project
------------------------------------------------------------
testRuntimeClasspath - Runtime classpath of source set 'test'.
+--- org.junit.jupiter:junit-jupiter-api:5.5.2
| +--- org.apiguardian:apiguardian-api:1.1.0
| +--- org.opentest4j:opentest4j:1.2.0
| \--- org.junit.platform:junit-platform-commons:1.5.2
| \--- org.apiguardian:apiguardian-api:1.1.0
\--- org.junit.jupiter:junit-jupiter-engine:5.5.2
+--- org.apiguardian:apiguardian-api:1.1.0
+--- org.junit.platform:junit-platform-engine:1.5.2
| +--- org.apiguardian:apiguardian-api:1.1.0
| +--- org.opentest4j:opentest4j:1.2.0
| \--- org.junit.platform:junit-platform-commons:1.5.2 (*)
\--- org.junit.jupiter:junit-jupiter-api:5.5.2 (*)