Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单元测试GMavenPlus Groovy Mojos-未扩展project.basedir_Maven_Groovy_Junit4_Mojo_Gmaven - Fatal编程技术网

单元测试GMavenPlus Groovy Mojos-未扩展project.basedir

单元测试GMavenPlus Groovy Mojos-未扩展project.basedir,maven,groovy,junit4,mojo,gmaven,Maven,Groovy,Junit4,Mojo,Gmaven,我目前正在尝试使用GMavenPlus(谢谢@Keegan!)和Groovy 2.4.3编写一个Maven插件。简而言之 该插件解析SQL DDL目录,并从解析后的DDL生成输出 当在一个完全消耗的项目中构建、导入和运行时,Mojo本身工作正常。好啊 问题在于单元测试。当尝试对这个Mojo进行单元测试时,像${project.basedir}这样的Maven POM变量不会被激活 扩展,因此mojo失败,出现了一个错误,如“找不到文件![${project.basedir}/src/test/r

我目前正在尝试使用GMavenPlus(谢谢@Keegan!)和Groovy 2.4.3编写一个Maven插件。简而言之 该插件解析SQL DDL目录,并从解析后的DDL生成输出

当在一个完全消耗的项目中构建、导入和运行时,Mojo本身工作正常。好啊

问题在于单元测试。当尝试对这个Mojo进行单元测试时,像
${project.basedir}
这样的Maven POM变量不会被激活 扩展,因此mojo失败,出现了一个错误,如“找不到文件![${project.basedir}/src/test/resources/ddl]”。作为 您可以从该错误消息中看到,
${project.basedir}
作为文本传递,而不是展开

我目前正在使用Maven插件测试工具(具有固定的依赖项,请参阅)、JUnit4.12和AssertJ 3.0.0作为我的测试堆栈

在单元测试中扩展project.basedir之类的东西有什么想法或具体的技巧吗

提前谢谢

有关的单元测试:

import edge.SqlToScalaMojo
import org.junit.Before
import org.junit.Test

/**
 * Created by medge on 6/15/15.
 */
class SqlToScalaMojoTest extends BaseMojoTest<SqlToScalaMojo> {

    SqlToScalaMojo mojo

    @Before
    void setup() {
        mojo = getMojo("parse-ddls")
    }

    @Test
    void testMojoExecution() throws Exception {
        assertThat mojo isNotNull()

        mojo.execute()
    }
}
Mojo本身的主POM文件:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>edge</groupId>
    <artifactId>parser-mojo</artifactId>
    <version>0.0.3-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>

    <properties>
        <groovy.version>2.4.3</groovy.version>
        <maven.version>3.3.3</maven.version>
        <junit.version>4.12</junit.version>
        <assertj.version>3.0.0</assertj.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>${groovy.version}</version>
        </dependency>

        <!-- Test dependencies -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj.version}</version>
            <scope>test</scope>
        </dependency>


        <!-- Dependencies for Maven Mojos -->
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-utils</artifactId>
            <version>3.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>${maven.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-artifact</artifactId>
            <version>${maven.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-compat</artifactId>
            <version>${maven.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>${maven.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-testing</groupId>
            <artifactId>maven-plugin-testing-harness</artifactId>
            <version>3.3.0</version>
            <scope>test</scope>
            <type>jar</type>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.5</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>addSources</goal>
                            <goal>addTestSources</goal>
                            <goal>generateStubs</goal>
                            <goal>compile</goal>
                            <goal>testGenerateStubs</goal>
                            <goal>testCompile</goal>
                            <goal>removeStubs</goal>
                            <goal>removeTestStubs</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.4</version>
                <configuration>
                    <!-- see http://jira.codehaus.org/browse/MNG-5346 -->
                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                </configuration>
                <executions>
                    <execution>
                        <id>generate-descriptor</id>
                        <goals>
                            <goal>descriptor</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>help-goal</id>
                        <goals>
                            <goal>helpmojo</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

4.0.0
边缘
解析器魔咒
0.0.3-快照
maven插件
2.4.3
3.3.3
4.12
3.0.0
org.codehaus.groovy
groovy all
${groovy.version}
朱尼特
朱尼特
${junit.version}
org.assertj
assertj核心
${assertj.version}
测试
org.codehaus.plexus
尾丛
3.0.22
org.apache.maven
马文堆芯
${maven.version}
org.apache.maven
马文伪影
${maven.version}
假如
org.apache.maven
马文同胞
${maven.version}
org.apache.maven
maven插件api
${maven.version}
org.apache.maven.plugin-tools
maven插件注释
3.4
假如
org.apache.maven.plugin-testing
maven插件测试线束
3.3.0
测试
罐子
org.codehaus.gmavenplus
gmavenplus插件
1.5
添加源
addTestSources
发电集团
编译
TestGenerateSubs
测试编译
removeStubs
除去树桩
org.apache.maven.plugins
maven插件
3.4
真的
生成描述符
描述符
帮助目标
帮助魔咒
单元测试期间使用的测试POM:

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>edge</groupId>
                <artifactId>parser-mojo</artifactId>
                <version>0.0.3-SNAPSHOT</version>
                <configuration>
                    <template>${project.basedir}/src/test/resources/sample.template</template>
                    <inputDir>${project.basedir}/src/test/resources/ddl</inputDir>
                    <outputDir>${project.basedir}/src/test/resources/generated/</outputDir>
                </configuration>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>parse-ddls</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

边缘
解析器魔咒
0.0.3-快照
${project.basedir}/src/test/resources/sample.template
${project.basedir}/src/test/resources/ddl
${project.basedir}/src/test/resources/generated/
产生资源
解析DDL

谢谢

找到了我自己问题的答案。在这里张贴,以防其他人正在寻找相同的问题

首先,关于
@参数
注释,我遇到了Mojo本身的另一个问题。以下是:

@Parameter(defaultValue = "${project.basedir}/src/main/resources")
String inputDir
将生成错误,因为Groovy编译器将在Maven之前拾取字符串
“${project.basedir}/src/main/resources”
。然后它将进行求值并将其转换为GString。这将生成一个错误,因为注释需要java.lang.String,但它将获得java.lang.Object

正如@Keegan在中指出的,解决方案是使用单引号而不是双引号:

@Parameter(defaultValue = '${project.basedir}/src/main/resources')
String inputDir
Groovy编译器不会对字符串求值,Maven将从中提取

接下来,关于defaultValue的原始问题在单元测试期间没有被读取。罪魁祸首是BaseMojoTest.groovy中的这种方法:

T getMojo(String goal, File pom) {
    T mojo = (T) rule.lookupMojo(goal, pom)

    mojo
}
具体而言,本部分:

rule.lookupMojo(goal, pom)
MojoRule上的lookupMojo不计算参数注释的默认值。它希望所有可能的参数都存在于测试POM文件中。快速深入了解MojoRule的源代码,我找到了修复它的方法:

/**
 * Get a configured mojo using the specified pom file
 *
 * @param goal Goal to look up
 * @param pom POM file to use when configuring Mojo
 * @return T configured Mojo
 */
T getMojo(String goal, File pom) {
    T mojo = (T) rule.lookupConfiguredMojo(getMavenProject(pom), goal)

    mojo
}

/**
 * Method to handle creating a MavenProject instance to create configured Mojos from
 * @param pom File to POM file containing Mojo config
 * @return MavenProject
 */
MavenProject getMavenProject(File pom) {
    // create the MavenProject from the pom.xml file
    MavenExecutionRequest request = new DefaultMavenExecutionRequest()
    ProjectBuildingRequest configuration = request.getProjectBuildingRequest()
            .setRepositorySession(new DefaultRepositorySystemSession())
    MavenProject project = rule.lookup(ProjectBuilder.class).build(pom, configuration).getProject()

    project.basedir = new File(getBaseDir())

    // Implicit assert
    assertThat project isNotNull()

    // And return
    project
}
getMavenProject()
方法与
MojoRule#readMavenProject()
中的代码略有不同,修改为引用MojoRule和我对getBaseDir()的定义。此方法生成的MOJO现在正确地计算@Parameter的defaultValue!我确实觉得
getMavenProject()
可能会更有效(而不是每次都创建一个MavenProject),但这就足够了

还有一件事

您可能已经注意到了
getMavenProject中的这一行(
/**
 * Get a configured mojo using the specified pom file
 *
 * @param goal Goal to look up
 * @param pom POM file to use when configuring Mojo
 * @return T configured Mojo
 */
T getMojo(String goal, File pom) {
    T mojo = (T) rule.lookupConfiguredMojo(getMavenProject(pom), goal)

    mojo
}

/**
 * Method to handle creating a MavenProject instance to create configured Mojos from
 * @param pom File to POM file containing Mojo config
 * @return MavenProject
 */
MavenProject getMavenProject(File pom) {
    // create the MavenProject from the pom.xml file
    MavenExecutionRequest request = new DefaultMavenExecutionRequest()
    ProjectBuildingRequest configuration = request.getProjectBuildingRequest()
            .setRepositorySession(new DefaultRepositorySystemSession())
    MavenProject project = rule.lookup(ProjectBuilder.class).build(pom, configuration).getProject()

    project.basedir = new File(getBaseDir())

    // Implicit assert
    assertThat project isNotNull()

    // And return
    project
}
project.basedir = new File(getBaseDir())
MavenProject project = rule.lookup(ProjectBuilder.class).build(pom, configuration).getProject()
@Parameter(defaultValue='${project.basedir}/src/main/resources')
String inputDir
<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.example.maven.plugin.MyPlugin</groupId>
    <artifactId>testProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Test MyPlugin</name>

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

    <build>
        <plugins>
            <plugin>
                <artifactId>myPlugin-maven-plugin</artifactId>
                <configuration>
                    <testDirectory>${basedir}\src\test\resources\testDir</testDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>