如何将属性或环境变量注入我的Maven插件测试用例?

时间:2014-10-10 15:49:01

标签: maven maven-plugin

我已使用AbstractMojo创建了一个Maven插件,并且我试图对其进行测试。

我使用maven-plugin-testing-harness进行测试,但我在为插件参数注入值方面遇到了问题。

我有以下用于测试的pom.xml文件(src/test/resources/pom.xml):

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.vodori.pepper.docker.vm.unit</groupId>
    <artifactId>test-pom</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Test VMStarter</name>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.vodori.common</groupId>
                <artifactId>pepper-docker-vm</artifactId>
                <version>1.0.1-SNAPSHOT</version>
                <configuration>
                    <dockerSnapshotSite>pepper-demo-site</dockerSnapshotSite>
                    <dockerSnapshotVersion>3.6.11</dockerSnapshotVersion>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

我的Mojo看起来像这样(在顶部):

public abstract class VMPlugin extends AbstractMojo {

    /**
     * Docker location
     */
    @Parameter(required = true, property = "docker.path", defaultValue = "${env.DOCKER_LOCATION}")
    String dockerPath;

    public void setDockerPath(String dockerPath) {
        this.dockerPath = dockerPath;
    }

    /**
     * Docker VM Site name
     */
    @Parameter(required = true, property = "docker.snapshot.site")
    String dockerSnapshotSite;

    /**
     * Version of Docker snapshot
     */
     @Parameter (required = true, property="docker.snapshot.version")
    String dockerSnapshotVersion;

我使用@MojoRule方法进行测试,我的设置方法如下所示:

@Before
public void setUp() throws Exception {
    vmStarter = (VMStarter) rule.lookupMojo( "start-docker-vm", "src/test/resources/pom.xml" );
    assertNotNull(vmStarter);
}

我为我的一些测试用例(那些测试 docker位置的测试用例)使用setter,但是对于我的良好路径测试,我想依赖于环境变量DOCKER_LOCATION填充。但是,出于某种原因,dockerPath只是显示为null。好像defaultValue被忽略了。

我尝试将System.getEnv()转储到STDERR上,我可以看到DOCKER_LOCATION 确实是设置。

我在这里缺少什么?为什么我的@Parameter填充不正确?

1 个答案:

答案 0 :(得分:1)

你从哪里获得语法defaultValue = "${env.DOCKER_LOCATION}"

env.*property“您可以在pom.xml文件或Maven资源插件的过滤功能正在处理的任何资源中使用Maven属性。”

default-value需要expression

Guide to Developing Java Plugins, Introduction提到:“(更多信息可在”参数表达式“文档中找到)”但到目前为止我还没有找到这样的文件。 Thx @khmarbaise:org.apache.maven.plugin.PluginParameterExpressionEvaluator

help:expressions未向我的Maven 3.2.1显示${env}

虽然我的经验是,至少有一些(如果不是全部)链接文档不是最新的并且保留了最新的增强功能。

从程序逻辑的角度可能的解释:如果必须在程序范围之外设置默认值,则不能将其视为默认值。在Maven的意义上Convention Over Configuration

编辑:添加了 Expressions API文档的链接。