使用Maven插件测试工具测试Mojos的默认值和表达式:

时间:2012-02-29 09:29:04

标签: unit-testing maven

使用Maven插件测试工具(2.0-alpha1)时遇到问题:当我想测试我的Mojo时,参数的默认值和表达式不适用。 我有以下参数:

/**
 * <p>The output file to write the settings to.</p>
 *
 * @parameter default-value="${project.build.directory}/myProperties.properties" expression="${properties.file}"
 */

private String file;

当我运行单元测试时,此属性始终为null。我尝试注入一个成功返回${project.build.directory}的MavenProjectStub,但这不适用于我的Mojo参数。

有没有办法在测试期间在我的Mojos中启用${project.build.directory}之类的默认值和表达式?

4 个答案:

答案 0 :(得分:9)

所以它看起来像they added lookupConfiguredMojo for just this use case。我花了一段时间才弄清楚如何调用它,因为你需要一个正确配置MavenProject来使用它。这对我有用:

File pomFile = ...

MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
ProjectBuildingRequest buildingRequest = executionRequest.getProjectBuildingRequest();
ProjectBuilder projectBuilder = this.lookup(ProjectBuilder.class);
MavenProject project = projectBuilder.build(pomFile, buildingRequest).getProject();

MyMojo mojo = (MyMojo) this.lookupConfiguredMojo(project, "my-goal");
...

答案 1 :(得分:6)

我在测试插件时遇到了很多问题。每个问题只需要几行修复,但找到它们并不容易。这里的指针有所帮助!

我把它们组合成一个 BetterAbstractMojoTestCase.java课程。它包含了神奇的线条,解决了我遇到的半瞌睡问题;并且它为您的问题提供lookupConfiguredMojo(File pom, String goal)方法。

答案 2 :(得分:2)

我遇到了同样的问题,找不到任何解决方案,所以我决定自己解决。我已经查看了最新版本的maven-plugin-testing-harness(目前是2.0-alpha-1)的源代码,并将其放在我自己的github存储库中。

您必须从那里签出代码并在本地构建。

您需要在项目中进行的唯一更改是替换POM中的依赖项。我使用自己的domain / groupId名称而不是Apache,只是为了避免与未来的Apache版本发生任何冲突(和混淆)。

这是您需要放入POM的内容:

<dependency>
    <groupId>com.menttis.maven.plugin-testing</groupId>
    <artifactId>maven-plugin-testing-harness</artifactId>
    <version>2.0.1</version>
    <scope>test</scope>
</dependency>

这是您可以从中获取代码的存储库:https://github.com/grighetto/maven-plugin-testing-harness

答案 3 :(得分:0)

对于版本3 +:

    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.5</version>
        <scope>provided</scope>
    </dependency>
在我意识到我正在将注释语法与javadoc语法混合之前,我花了一些时间对此感到困惑。

@Parameter(property = "project.build.directory")
private String projectBuildDir;

然后将您的文件名与该值连接起来,以完成代码中的路径。