SpringJUnit4ClassRunner 不会在 JUnit 测试用例结束时关闭 Application Context

2022-09-01 10:18:20

我在我的JUnit 4测试中使用SpringJUnit4ClassRunner,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
public class MyTest {
    @Autowired
    private ConfigurableApplicationContext context;
    @Test
    public void test1() {
    . . .
    }
    @Test
    public void test2() {
    . . .
    }
    . . .
}

但是,在此测试用例结束时,不会关闭应用程序上下文。我希望在测试用例结束时关闭应用程序上下文(而不是在测试用例中每个单元测试的末尾)。

到目前为止,我可以想出这个解决方法:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
public class MyTest {
    @Autowired
    private ConfigurableApplicationContext context;
    private static ConfigurableApplicationContext lastContext;
    @After
    public void onTearDown() {
        lastContext = context;
    }
    @AfterClass
    public static void onClassTearDown() {
        lastContext.close();
    }
    @Test
    public void test1() {
    . . .
    }
    @Test
    public void test2() {
    . . .
    }
    . . .
}

有没有更好的解决方案?


答案 1

您可以在类级别添加@DirtiesContext(classMode=ClassMode.AFTER_CLASS),一旦方法中的所有测试完成,上下文将关闭。您将获得与当前代码相同的功能。


答案 2

您如何运行测试?

默认情况下,Spring 不会在测试用例关闭时关闭上下文。相反,它安装当 JVM 退出时运行的 shutdown hook。引入这种晦涩难懂的机制是为了允许测试上下文缓存,这是一件好事。

根据我的经验,当从我的IDE和运行JUnit测试时,这可以正常工作。您的解决方案有点黑客攻击,当然不应该被需要。maven-surefire-plugin


推荐