有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SpringJUnit4ClassRunner不会在JUnit测试用例结束时关闭应用程序上下文

我在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() {
    . . .
    }
    . . .
}

有更好的解决办法吗


共 (2) 个答案

  1. # 1 楼答案

    你是如何进行测试的

    默认情况下,Spring不会在测试用例关闭时关闭上下文。相反,它安装了在JVM退出时运行的关闭钩子。引入这种模糊的机制是为了允许测试上下文caching,这是一件好事

    根据我的经验,当JUnit测试从我的IDE和maven-surefire-plugin运行时,这是正确的。你的解决方案有点像黑客,当然不需要

  2. # 2 楼答案

    您可以在类级别添加^{},一旦方法中的所有测试完成,上下文就会关闭。您将获得与当前代码相同的功能