Testing Project Artifact
NOTE
Note: This example improves the cookbook to play with artifact handler.
Sometimes, your Mojo uses project artifact and ArtifactHandler mechanisms. For instance, you could need to filter on Java projects, i.e.:
import javax.inject.Inject;
import org.apache.maven.project.MavenProject;
public class MyMojo extends AbstractMojo {
/**
* The Maven Project.
*/
private final MavenProject project;
@Inject
MyMojo(MavenProject project) {
this.project = project;
}
public void execute() throws MojoExecutionException {
// ...
ArtifactHandler artifactHandler = project.getArtifact().getArtifactHandler();
if ("java".equals(artifactHandler.getLanguage())) {
//...
}
// ...
}
}
Create a test
import org.apache.maven.api.di.Provides;import org.apache.maven.api.plugin.testing.InjectMojo;
import org.apache.maven.api.plugin.testing.MojoTest;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;import org.apache.maven.project.MavenProject;
import org.junit.jupiter.api.Nested;
import org.mockito.Mockito;
@MojoTest
class ArtifactTest {
@Inject
private MavenProject project;
@Test
@InjectMojo(goal = "test")
void testUsingMockito(MyMojo mojo) {
// Mock ArtifactHandler
ArtifactHandler artifactHandler = Mockito.mock(ArtifactHandler.class);
Mockito.when(artifactHandler.getLanguage()).thenReturn("java");
// Mock Artifact
Artifact artifact = Mockito.mock(Artifact.class);
Mockito.when(artifact.getArtifactHandler()).thenReturn(artifactHandler);
// Set the mocked Artifact to the default provided project
project.setArtifact(artifact);
// Now you can test your Mojo logic that depends on the ArtifactHandler
mojo.execute();
}
@Nested
class NestedTest1 {
@Inject
private ArtifactHandlerManager artifactHandlerManager;
@Provides
MavenProject stubbedProject() {
MavenProject stubProject = new CustomMavenProject(); // your custom implementation
ArtifactHandler stubArtifactHandler = new CustomArtifactHandler(); // your custom implementation
// You can also get a real ArtifactHandler from the manager if needed
ArtifactHandler jarArtifactHandler = artifactHandlerManager.getArtifactHandler("jar");
Artifact stubArtifact = new CustomArtifact(stubArtifactHandler); // your custom implementation
stubProject.setArtifact(stubArtifact);
return stubProject;
}
@Test
@InjectMojo(goal = "test")
void testUsingStubbedProject (MyMojo mojo) {
// Use the stubbed project in your test
mojo.execute();
}
}
}



