Moreover I wanted to keep unit tests separated from integration tests and if possible with different compilation life cycles so that the flow is:
1. compile the project code from src/main/java using the default compiler
2. compile and run the unit tests using the mixed java-groovy eclipse compiler
3. compile and run the integration tests using the mixed java-groovy eclipse compiler
This way the production code is compiled natively while we can play with java-groovy mixed classes in unit and integration tests.
After digging a lot and trying many unsuccessful approaches I got it working exactly as I wished.
Here is the pom:
As you may notice, I have left the unit tests in the standard maven path ie.
src/test/java
, but, if I want to further move them to src/test/unit/java
then I need to configure both the compiler section and the surefire-plugin section in the same way I did for the integration tests.Basically the secret in in instructing the compiler on:
- when to run (we configure this aspect within an
execution
section)- where to compile sources from - within the element
compilesourceroots
- where to output classes
- what classes (by name or pattern) to include - in the element
outputDirectory
and at the same time to instruct the test runner (surefire or failsafe) on:
- where the test sources are located - within
testSourceDirectory
- when the test classes are located - within
testClassesDirectory
One essential thing to notice is the id of each execution element (in our case
default-testCompile
and integration-testCompile
, because maven identifies each instance by it's id s it must be uniquely named.Another thing that many don't know is that the ids can be overridden and indeed I have used the default maven compiler id for the unit test compilation so that only the eclipse compiler shall be run instead of runing also the default compiler. you can change the id and test yourself.
Hope that shall help you too!
Cheers, Dikran