并行JUnit测试不执行shutdown hook

Jer*_*edM 7 java parallel-processing junit multithreading maven

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

根据Surfire文档文档,并行线程在同一进程中执行,因此我希望Runtime.getRuntime是相同的进程,即使它是在不同的测试和线程之间调用的. Maven Surfire插件 - 分叉选项和并行测试执行

使用parallel选项时要记住的重要事项是:并发发生在同一个JVM进程中.这在内存和执行时间方面是有效的,但您可能更容易受到竞争条件或其他意外且难以重现的行为的影响.

这是我单元测试的一个例子:

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

这是我的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>
Run Code Online (Sandbox Code Playgroud)

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

Ado*_*nis 0

你的 shutdown Hooks 实际上被调用了,我相信问题来自于system.out.println与 maven 的 shutdown hooks 相关的调用。

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

Test clean up triggered
Run Code Online (Sandbox Code Playgroud)

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

    @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);   
    }
Run Code Online (Sandbox Code Playgroud)

我可以在我的主管的根目录中看到调用后创建的文件“test1”mvn clean test

测试用:

  • openjdk版本“1.8.0_121”
  • 朱尼特 4.12
  • Maven 3.3.9
  • Maven Surefire 插件 2.17