并行JUnit测试不执行shutdown hook

时间:2015-09-29 21:58:06

标签: java multithreading maven junit parallel-processing

我正在使用Maven在并行类中运行多个JUnit测试。我有清理任务,需要在所有JUnit测试运行后发生。为了处理这个清理工作,我在一些测试中添加了一个关闭钩子。当我并行运行时,关闭挂钩正确执行,但是当我并行运行时,我没有看到关闭挂钩的输出(参见示例)。有什么我做错了吗?在并行执行JUnit测试时,JVM是否使用System.exit退出?

根据Surfire文档文档,并行线程在同一进程中执行,因此我希望Runtime.getRuntime是相同的进程,即使它是在不同的测试和线程之间调用的。 Maven Surfire Plugin - Fork Options and Parallel Test Execution

  

并行选项要记住的重要事项是:   并发发生在同一个JVM进程中。这很有效率   内存条款和执行时间,但你可能更容易受到攻击   对于竞争条件或其他意外和难以重现   行为。

以下是我的单元测试中的一个示例:

@Test
public void test()
{
    Runtime.getRuntime().addShutdownHook(new Thread()
    {
        @Override
        public void run()
        {
            System.out.println("Test clean up triggered");
        }
    });
}

这是我的pom的相关部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <parallel>classes</parallel>
        <threadCount>10</threadCount>
    </configuration>
</plugin>

编辑: 当我在@BeforeClass方法中添加关闭挂钩时,问题得以解决。当我在@Test方法中添加它时,我遇到了问题。我希望能够随时添加钩子。

1 个答案:

答案 0 :(得分:0)

你的关机钩子实际上是被调用的,我认为这个问题来自与maven关闭钩子关联的system.out.println调用。

直接用Eclipse测试,我有输出:

Test clean up triggered

尝试稍微不同的测试版本:

    @Test
    public void test()
    {
        System.out.println("Testing");
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                try {
                                Files.createFile(Paths.get("test1"));
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
            }
        });

        assertTrue(true);   
    }

我可以在导演的根目录中看到文件&#34; test1&#34;在致电mvn clean test

后创建

用以下方法进行的测试:

  • openjdk version&#34; 1.8.0_121&#34;
  • Junit 4.12
  • Maven 3.3.9
  • Maven surefire-plugin 2.17