如何在调用 JVM 的关闭钩子之前关闭 @SpringBootTest 上下文(一次,在所有 JUnit 测试之后)

And*_*ete 5 java spring spring-test junit5

问:@SpringBootTest如何在 JUnit 5 停止 JVM(调用用 添加的钩子addShutdownHook())之前关闭通过用 注释测试类创建的 Spring Boot 上下文?


示例:
假设有一个像这样的 bean

@Component
public class SomeBean implements DisposableBean {

    public SomeBean() {
        var hook = new Thread(() -> System.out.println("Shutdown Hook called"));
        Runtime.getRuntime().addShutdownHook(hook);
    }

    @Override
    public void destroy() {
        System.out.println("Destroy called");
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个简单的 Junit 5 测试,如下所示:

@SpringBootTest
class TestJvmShutdownHookApplicationTests {

    @Test
    void contextLoads() {
    }

}

Run Code Online (Sandbox Code Playgroud)

destroy()如何在 JVM 关闭挂钩之前执行调用?

2021-02-18 13:54:24.540  INFO 18928 --- [           main] .a.t.TestJvmShutdownHookApplicationTests : Started TestJvmShutdownHookApplicationTests in 2.378 seconds (JVM running for 3.687)
Shutdown Hook called
2021-02-18 13:54:24.863  INFO 18928 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
Destroy called
Run Code Online (Sandbox Code Playgroud)

后台 it.ozimov:embedded-redis添加了一个 JVM 关闭钩子,并在 bean redisConnectionFactory(Lettuce)被销毁之前关闭 Redis 服务器。

Sam*_*nen 4

目前没有内置支持来实现这一点。

有关更多详细信息,请参阅Spring 框架的问题跟踪器中的“执行所有测试后关闭 TestContext 框架中的所有 ApplicationContext”问题。

目前,正确关闭Spring TestContext 框架ApplicationContext缓存的唯一方法是通过或调用的自定义@DirtiesContextTestExecutionListenerTestContext#markApplicationContextDirty(...)