Testing Complex Mojo Parameters
Note: This example improves the cookbook for testing complex Mojo parameters.
In real plugin development, you will use specific Maven objects like MavenProject, MavenSession, MavenSettings and so on.
Provided mocks and stubs
The Maven Plugin Testing Harness provides mocks and stubs for the following Maven objects. For creating mocks Mockito framework is used.
MavenSession
There is provided a mock for MavenSession with basic configuration:
session#getUserPropertiesandsession#getSystemPropertiesemptyPropertiesobjects.session#getCurrentProject- a current preparedMavenProjectsession#getLocalRepository- equals torequest#getLocalRepositorysession#getRequestreturns aspyforDefaultMavenExecutionRequestwith configurationrequest#getStartTime- celling timerequest#getBaseDirectory()- current base directoryrequest#getUserProperties,request#getSystemProperties- copy ofMavenSessionpropertiesrequest#getLocalRepository,request#getLocalRepositoryPath- point to local repository in${basedir}/target/local-reporequest#getRemoteRepositories,request#getPluginArtifactRepositories- default remote repositories for Maven Central
If @MojoTest(realRepositorySession = true) is used, then session#getRepositorySession returns
a real RepositorySystemSession configured with local repository in ${basedir}/target/local-repo
and default remote repositories for Maven Central.
MavenProject
There is provided a spy for MavenProject with basic configuration:
project#getBasedir- current base directoryproject#getCompileSourceRoots-${basedir}/src/main/javaproject#getTestCompileSourceRoots-${basedir}/src/test/javaproject#getBuild- a spy forBuildwith configurationbuild#getDirectory-${basedir}/targetbuild#getOutputDirectory-${basedir}/target/classesbuild#getTestOutputDirectory-${basedir}/target/test-classesbuild#getSourceDirectory-${basedir}/src/main/javabuild#getTestSourceDirectory-${basedir}/src/test/javabuild#getResources-${basedir}/src/main/resourcesbuild#getTestResources-${basedir}/src/test/resources
If @MojoTest(realRepositorySession = true) is used, then project#getRemote*Repositories returns default remote repositories for Maven Central.
MojoExecution
There is provided a spy for MojoExecution with current plugin Mojo descriptor.
Plugin logger
There is provided a spy for Slf4j wrapper of org.apache.maven.plugin.logging.Log interface.
You can verify log messages using Mockito verifications.
Create custom Stubs for Maven objects
You can create your own stubs for Maven objects by define them in plugin test.
If you provide your own stub for a Maven object, then it will be used instead of the default provided one.
import javax.inject.Inject;
import org.apache.maven.api.di.Provides;
import org.apache.maven.api.plugin.testing.InjectMojo;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@MojoTest
class MyMojoTest {
// define your stub for MavenProject
@Provides
MavenProject stubProject() {
// return your stub implementation
return new MavenProjectStub();
}
@Provides
MavenSession stubSession() {
// return your stub implementation
return new MyMavenSessionStub();
}
// inject the stubbed or default MavenSession
@Inject
private MavenSession session;
@Inject
private Log log;
@BeforeEach
void setup() {
// customize injected stubs or mocks
Mockito.when(session.getSettings()).thenReturn(new MySettingsStub());
}
@Test
@InjectMojo(goal = "my-goal")
void myMojoTest(MyMojo mojo) {
mojo.execute();
// your verifications, eg
Mockito.verify(log).info("My info log message");
}
// you can also group stubs in nested test classes
@Nested
class NestedTest {
// define your stub for MavenProject in nested class
@Provides
MavenProject stubProject() {
// return your stub implementation
return new MavenProjectStub2();
}
@BeforeEach
void setup() {
// customize injected stubs or mocks for this nested class
Mockito.when(session.getSettings()).thenReturn(new MySettingsStub());
}
@Test
@InjectMojo(goal = "my-goal")
void myMojoTest(MyMojo mojo) {
mojo.execute();
// your verifications
}
}
}



