Skip to content

Instantly share code, notes, and snippets.

@Sch3lp
Last active February 1, 2022 22:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Sch3lp/ee256784543d3e80d4eb to your computer and use it in GitHub Desktop.
Save Sch3lp/ee256784543d3e80d4eb to your computer and use it in GitHub Desktop.
Custom SourceSet for exposing TestBuilders through a shared-test jar using Gradle
dependencies {
// a-services-api dependencies, if any
}
sourceSets {
sharedTest {
java {
compileClasspath += sourceSets.main.runtimeClasspath
srcDirs 'src/sharedTest/java'
}
}
}
compileJava {
doLast {
compileSharedTestJava
}
}
task sharedTestJar(type: Jar, dependsOn: compileSharedTestJava) {
from sourceSets.sharedTest.output
classifier = 'shared-test'
}
configurations {
sharedTestCompile.extendsFrom compile //might not be necessary
sharedTestProvided.extendsFrom provided //might not be necessary
sharedTest
}
artifacts {
sharedTest sharedTestJar
}
jar {
dependsOn {
sharedTestJar
}
}
dependencies {
// other compile dependencies...
testCompile project(path:':a-services-api', configuration: 'sharedTest')
}

#Context We have a project set-up of:

project-A
  a-services-api
  a-services-impl
project-B
  b-services-api
  b-services-impl
non-gradle-project-C

a-services-impl depends on a-services-api through project dependency. b-services-impl also depends on a-services-api through project dependency. non-gradle-project-C also depends on a-services-api through jar dependency.

#Problem a-services-api contains a class that we wish to only be instantiatable in a-services-impl and nowhere else. But we want to be able to do so within the tests of b-services-impl. So, TestBuilder pattern to the rescue!

project-A
  a-services-api
    src/main/java/be/swsb/example/ExampleTO.java --> has package/default protected constructor
    src/sharedTest/java/be/swsb/example/ExampleTestBuilder.java
  a-services-impl
    src/main/java/be/swsb/example/ExampleTOFactory.java (or ExampleTOBuilder.java)
project-B
  b-services-impl
    src/main/java/be/swsb/exampleusage/UsesExampleInterface.java
    src/main/test/be/swsb/exampleusage/UsesExampleInterfaceTest.java --> needs to be able to instantiate (and not Mock!!!) an ExampleTO
non-gradle-project-C
  same config as project-B really

Note that we created our own SourceSet called sharedTest. Because we think making a separate SourceSet is clearer than filtering *TestBuilder.java within the default src/test/java SourceSet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment