#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
.