在Maven的测试阶段结束时执行代码的推荐方法是什么?

时间:2016-03-31 19:57:15

标签: maven unit-testing maven-surefire-plugin

我有一些JUnit测试在test阶段并行执行,每次测试输出一个.json文件,我想调用自定义Java方法对这些文件进行一些聚合和后处理所有测试都已完成执行。

integration-test阶段之后是默认Maven生命周期中的post-integration-test阶段,但测试阶段后面没有post-test阶段,我宁愿不滥用某些阶段为此目的的其他阶段。

问题:在test阶段结束时对结果进行后处理的推荐方法是什么?

1 个答案:

答案 0 :(得分:1)

another SO post中所述,Maven中没有post-test阶段有充分理由(主要是单元测试是单元测试)。

但是,在您的情况下,您不需要创建额外的Maven插件,这可能会解决问题,但在维护,测试和共享方面也会增加额外的复杂性。

由于您已经在Java方法中拥有了所需的代码 - 如问题所述 - 使用Exec Maven Plugin及其java目标可能更有意义。

您可以简单地添加到您的POM中:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1.1</version>
    <executions>
        <execution>
            <phase>test</phase> <!-- executed as post-test, that is, after Surefire default execution -->
            <goals>
                <goal>java</goal>
            </goals>
            <configuration>
                <mainClass>com.sample.JsonFileAggregator</mainClass> <!-- your existing Java code, wrapped in a main -->
                <arguments>
                    <argument>${project.build.directory}</argument> <!-- directory from where to load json files -->
                </arguments>
                <classpathScope>test</classpathScope> <!-- if your Java code is in test scope -->
            </configuration>
        </execution>
    </executions>
</plugin>

也就是说,将其执行绑定到test阶段,Maven将在任何默认绑定之后执行它(因此在默认的Maven Surefire执行之后)并且执行为post-test

然后可以通过精心设计的(如果不是已经存在的)Java main调用现有的Java代码,可能会将其传递给它参数(例如从上面的代码段中加载.json文件的目录到{{1 }}文件夹,通过其标准属性target,作为示例)。此外,正如代码段中所述,您的Java代码可能位于${project.build.directory}范围内(即test下),因此要使其可见,您还需要配置src/test/java相应