【问题标题】:How to make MavenProject injected into the mojo during test lookup?如何在测试查找期间将 MavenProject 注入 mojo?
【发布时间】:2022-02-08 21:43:04
【问题描述】:

这是我的测试(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();
  }
}

这就是我在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;
}

问题是lookupMojo()返回的mojo没有project属性集(它是null)。

提出了一些解决方案here,但我不确定它如何与 JUnit 5 一起使用。

【问题讨论】:

标签: java maven


【解决方案1】:

我尝试使用与上述相同的配置。该插件工作正常,但 lookupMojo() 的测试似乎都没有工作。

类似的测试示例可以参考heresetUp 方法与您的类MyMojoTest 和链接中提供的示例有所不同。
应该调用super.setUp(); 而不是this.setUp(),以便初始化AbstractMojoTestCase 类中的所有对象。

maven-plugin-testing-harness 3.3.0junit 5.6.2 的测试用例无法工作的可能原因是因为它们不是 compatible
原因是

  1. maven-plugin-testing-harness 旨在与 Junit4 兼容。最新更新是很久以前的time,即 2014 年 12 月 17 日。Junit 4Junit 5 不兼容。我们必须使用Junit-Vintage-Engine 才能使其工作。
  2. maven-plugin-testing-harness 是使用 JDk-7 开发的,Junit 5 的最低要求是 Jdk-8。 来自harness 插件清单文件的信息

实施-供应商-Id:org.apache.maven.plugin-testing
建造者:igor
构建-Jdk:1.7.0_55
规范供应商:Apache 软件
Foundation Specification-Title:Maven插件测试机制

  1. 两个 jar 支持的 Maven 版本也不同。 link

很少有其他links 确认相同。

很少有库和信息链接可用于使用 Junit5 进行插件测试。虽然我还没有尝试过,但我只能找到其中的一小部分。

图书馆:

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

link 中还有几个 Jupiter 扩展库

与之相关的示例。

【讨论】:

    【解决方案2】:

    可能的解决方案

    解决方案 #1:使用AbstractMojoTestCase.lookupConfiguredMojo() 方法

    请以测试类的实现为例:maven-plugin-testing/ParametersMojoTest.java at maven-plugin-testing-3.3.0 · apache/maven-plugin-testing

    考虑到这个例子,请注意 Mojo 实例化方法:

    1. readMavenProject() 方法。

    2. Mojo 实例化使用readMavenProject()lookupConfiguredMojo() 方法:

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

    这种 Mojo 实例化方法为实例化的 Mojo 提供了正确的 MavenProject 参数值。

    一些额外的参考

    解决方案 #2:为插件测试 pom.xml:使用项目存根

    有必要通过引入带有存根的project 元素(configuration 元素)来更新测试pom.xml 文件。

    例如:

    <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>
    

    一些额外的参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2021-06-27
      • 2014-01-18
      • 2012-10-28
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多