Java 并行JUnit测试不';t执行关机钩子

Java 并行JUnit测试不';t执行关机钩子,java,multithreading,maven,junit,parallel-processing,Java,Multithreading,Maven,Junit,Parallel Processing,我正在使用Maven在并行类中运行多个JUnit测试。我有一些清理任务需要在所有JUnit测试运行之后执行。为了处理这个清理,我在一些测试中添加了一个关闭钩子。当我不是并行运行时,关闭钩子会正确执行,但是当我并行运行时,我看不到关闭钩子的输出(参见示例)。我做错什么了吗?在JUnit测试中并行执行时,JVM是否使用System.exit退出 根据SURFRE文档,并行线程在同一个进程中执行,因此我希望Runtime.getRuntime是同一个进程,即使它是在不同的测试和线程之间调用的。 使用

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

根据SURFRE文档,并行线程在同一个进程中执行,因此我希望Runtime.getRuntime是同一个进程,即使它是在不同的测试和线程之间调用的。

使用parallel选项需要记住的重要一点是: 并发发生在同一个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>

org.apache.maven.plugins
maven surefire插件
2.18.1
班级
10
编辑:
当我在
@BeforeClass
方法中添加关闭钩子时,问题得到了解决。当我在
@Test
方法中添加它时,我遇到了问题。我希望能够随时添加钩子。

您的关闭钩子实际上被调用,我认为问题来自与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);   
    }
我可以在我的控制器的根目录下看到调用
mvn clean test后创建的文件“test1”

使用以下设备进行的测试:

  • openjdk版本“1.8.0_121”
  • Junit 4.12
  • Maven 3.3.9
  • Maven surefire插件2.17

我的问题的关键是在Maven中并行运行测试,并在@BeforeClass中设置了关机挂钩。当我复制这个问题时,它是一个更大项目的一部分。我刚刚建立了一个Quick2测试项目,但问题没有重现。我不知道这是否仍然会重现,因为问题发生在很久以前。我不能确定是否执行了错误修复,或者在我的更大项目中是否有其他东西造成了问题。@JeredM上面的示例仅用于演示目的。在
@BeforeClass
方法中初始化关机挂钩确实更明智。现在,使用上面列出的设置,我尝试了各种组合,我遇到的唯一失败是由于无序测试(试图在声明挂钩之前移除挂钩,这是预期的错误)。出于好奇,您是否仍有此故障时使用的设置?我不再有此设置:(