6

This is my test (maven-plugin-testing-harness 3.3.0, junit 5.6.2):

import java.io.File;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public final class MyMojoTest extends AbstractMojoTestCase {
  @BeforeEach
  public void setup() throws Exception {
    this.setUp();
  }
  @Test
  public void executeIt() throws Exception {
   final File pom = new File("src/test/resources/my-test-pom.xml");
    final MyMojo mojo = MyMojo.class.cast(
      this.lookupMojo("mygoal", pom)
    );
    mojo.execute();
  }
}

This is what I have in MyMojo (maven-plugin-api 3.8.4):

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Mojo(name = "my", defaultPhase = LifecyclePhase.COMPILE)
public final class MyMojo extends AbstractMojo {
  @Parameter(defaultValue = "${project}", readonly = true)
  private MavenProject project;
}

The problem is that mojo returned by lookupMojo() doesn't have the project attribute set (it's null).

Some solution was proposed here, but I'm not sure how it can work with JUnit 5.

yegor256
  • 102,010
  • 123
  • 446
  • 597
  • Did you read https://maven.apache.org/plugin-developers/plugin-testing.html#integration-functional-testing? – Rob Spoor Feb 02 '22 at 08:45

2 Answers2

5

I tried with the same configurations as mentioned above. The plugin works fine but none of the tests having lookupMojo() seems to be working.

A similar test example can be referred here. There is a difference in the setUp method from your class MyMojoTest and example provided in the link.
super.setUp(); should be called instead of this.setUp() so as to initialize all the objects in AbstractMojoTestCase class.

The possible reason that the test case with maven-plugin-testing-harness 3.3.0 and junit 5.6.2 will not work because they are not compatible.
The reasons are

  1. maven-plugin-testing-harness was built to be compatible with Junit4. Latest update was a long time ago i.e. Dec 17, 2014. Junit 4 and Junit 5 are not compatible. We have to make use of Junit-Vintage-Engine to make it work.
  2. maven-plugin-testing-harness was develop using JDk-7 and minimum requirements for Junit 5 is Jdk-8. Information from the harness plugin Manifest file

Implementation-Vendor-Id: org.apache.maven.plugin-testing
Built-By: igor
Build-Jdk: 1.7.0_55
Specification-Vendor: The Apache Software
Foundation Specification-Title: Maven Plugin Testing Mechanism

  1. Maven version supported is also different for both the jars. link

Few other links confirm the same.

There are very few libraries and informational link available for plugin testing with Junit5. I could find only a handful of them, although I haven't tried them yet.

Library:

<dependency>
    <groupId>com.soebes.itf.jupiter.extension</groupId>
    <artifactId>itf-assertj</artifactId>
    <version>0.11.0</version>
    <scope>test</scope>
</dependency>

Few more Jupiter extension libraries in this link

Examples related to it.

TriS
  • 3,668
  • 3
  • 11
  • 25
2

Possible solutions

Solution #1: Use AbstractMojoTestCase.lookupConfiguredMojo() method

Please, consider the implementation of the test class as an example: maven-plugin-testing/ParametersMojoTest.java at maven-plugin-testing-3.3.0 · apache/maven-plugin-testing.

Considering this example, please, note the Mojo instantiation approach:

  1. The readMavenProject() method.

  2. The Mojo instantiation uses the readMavenProject() and lookupConfiguredMojo() methods:

    MavenProject project = readMavenProject( new File( "src/test/projects/default" ) );
    
    ParametersMojo mojo = (ParametersMojo) lookupConfiguredMojo( project, "parameters" );
    

This Mojo instantiation approach provides the instantiated Mojo with the correct MavenProject parameter value.

Some additional references

Solution #2: Test pom.xml for plugin: Use project stub

It is necessary to update the test pom.xml file by introducing the project element (of the configuration element) with the stub.

For example:

<project>

    <…>

    <build>
        <plugins>
            <plugin>
                <artifactId>touch-maven-plugin</artifactId>
                <configuration>
                    <project implementation="org.apache.maven.plugin.testing.stubs.MavenProjectStub">
                        <groupId implementation="java.lang.String">test-group-id</groupId>
                        <artifactId implementation="java.lang.String">test-artifact-id</artifactId>
                        <version implementation="java.lang.String">1.0.0-SNAPSHOT</version>
                    </project>

                    <…>

                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Some additional references