Migration to 3.4.0+

Since version 3.4.0, the Maven Plugin Testing Harness has been migrated to use JUnit 5 as the testing framework. This change allows for more modern testing practices and improved integration with other tools.

Migration receipts

Replace

public class MyMojoTest extends AbstractMojoTestCase {
}

by

@MojoTest
class MyMojoTest {
}

Replace

MyMojo myMojo = (MyMojo) lookupMojo("goal", pom);

by

@InjectMojo(goal = "goal", pom = "src/test/resources/unit/project-to-test/pom.xml")

Replace

public void test() {}
    MyCoponent myCoponent = lookup(MyCoponent.class);
}

by

@MojoTest 
class MyMojoTest {
    
    @Inject
    private MyCoponent myCoponent;
}

Replace implementation of stubs in the configuration XML file from

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>exmaple.test</groupId>
  <artifactId>example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <build>
    <plugins>
      <plugin>
        <groupId>org.exmaple.plugins</groupId>
        <artifactId>my-maven-plugin</artifactId>
        <configuration>
          <project implementation="org.example.plugin.stubs.MavenProjectStub" />
          <settings implementation="org.apache.maven.settings.Settings" />
          <reactorProjects>
            <project implementation="org.example.plugin.stubs.SubProject1Stub"/>
            <project implementation="org.example.plugin.stubs.SubProject2Stub"/>
          </reactorProjects>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

by code in the test class:

import javax.inject.Inject;

import java.util.Arrays;

import org.apache.maven.api.di.Provides;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
import org.junit.jupiter.api.BeforeEach;
import org.mockito.Mockito;

@MojoTest
class MyMojoTest {

    @Provides
    MavenProject stubProject() {
        // return your stub implementation
        return new MavenProjectStub();
    }

    // default Mockito mock for MavenSession will be injected
    @Inject
    private MavenSession session;

    // project crated by stubProject() method will be injected
    @Inject
    private MavenProject project;

    @BeforeEach
    void setup() {
        MavenProject stub1 = new SubProject1Stub();
        MavenProject stub2 = new SubProject2Stub();

        // reactorProjects
        Mockito.when(session.getProjects()).thenReturn(Arrays.asList(project, stub1, stub2));

        Mockito.when(session.getSettings()).thenReturn(new Settings());
    }
}