DEV Community

Karl Heinz Marbaise
Karl Heinz Marbaise

Posted on

Maven Plugin Testing - In a Modern way - Part V

In the previous part of the series - Maven Plugin Testing - In a Modern way - Part IV we have seen how to define goals to run Maven. In this part we will take a deeper look how we can define system properties for a Maven call to be used.

Let us take a look at a simple example taken from the previous part.

@MavenJupiterExtension
class BaseIT {

  @MavenTest
  @MavenGoal("verify")
  void the_first_test_case(MavenExecutionResult result) {
     ...
  }
}
Enter fullscreen mode Exit fullscreen mode

This will run Maven with the goal verify. So what could you do to prevent running the unit tests or even any tests at all within that integration test case? What would you usually do on plain command line? You would have added -DskipTests to your Maven command line. How could you do the above integration test example? Very easy like this:

@MavenJupiterExtension
class PropertyIT {

  @MavenTest
  @MavenGoal("verify")
  @SystemProperty("skipTests")
  void goal_clean_skiptests (MavenExecutionResult result) {
     ...
  }
}
Enter fullscreen mode Exit fullscreen mode

That means in the end that Maven will be called like the following:

mvn -DskipTests verify
Enter fullscreen mode Exit fullscreen mode

Let us go a step further and see how to write a test case for a plugin which should be called like this:

mvn ...:failure -DexecutionException=true -Dexception="This is the value of exception."
Enter fullscreen mode Exit fullscreen mode

The above could be expressed like this:

@MavenJupiterExtension
class PropertyIT {

  @MavenTest
  @MavenGoal("clean")
  @MavenGoal("${project.groupId}:${project.artifactId}:${project.version}:failure")
  @SystemProperty(value = "executionException", content = "true")
  @SystemProperty(value = "exception", content = "This is the value of exception.")
  void goal_failure_execution(MavenExecutionResult result) {
     ...
  }
}
Enter fullscreen mode Exit fullscreen mode

You can see two things here. First you can repeat the @SystemProperty to define multiple system properties and second you can make a clear separation between the name and property value.

As you might already expected you can create a meta annotation where you can combine the properties used in the previous example into this single meta annotation:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@SystemProperty(value = "executionException", content = "true")
@SystemProperty(value = "exception", content = "This is the value of exception.")
public @interface ExecutionException {
}
Enter fullscreen mode Exit fullscreen mode

If reconsider this it's thought a bit too short, because that can be made better like this:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@MavenTest
@MavenGoal("clean")
@MavenGoal("${project.groupId}:${project.artifactId}:${project.version}:failure")
@SystemProperty(value = "executionException", content = "true")
@SystemProperty(value = "exception", content = "This is the value of exception.")
public @interface FailureGoalWithExecutionException {
}
Enter fullscreen mode Exit fullscreen mode

So the defined meta annotation can now being used to make the test looking like this:

@MavenJupiterExtension
class PropertyIT {

  @FailureGoalWithExecutionException
  void goal_failure_execution(MavenExecutionResult result) {
     ...
  }
}
Enter fullscreen mode Exit fullscreen mode

You can define the previous described meta annotation in the example project and see how it feels to use it.

Based on convenience you can of course create a meta annotation like this:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@SystemProperty("skipTests")
public @interface MavenSkipTests {
}
Enter fullscreen mode Exit fullscreen mode

or other things. If you have good ideas do not hesitate to file in a feature request for the project so it can be made permanent part of it.

So this it is for Part V. If you like to learn more about the Integration Testing Framework
you can consult the users guide. If you like to know the state of the release you can take a look into the release notes.

If you have ideas, suggestions or found bugs please file in an issue on github.

An example project which shows the previous example can be found on GitHub.

Top comments (0)