【问题标题】:SpringJUnit4ClassRunner does not close the Application Context at the end of JUnit test caseSpringJUnit4ClassRunner 不会在 JUnit 测试用例结束时关闭 Application Context
【发布时间】:2011-11-21 19:53:58
【问题描述】:

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

有没有更好的解决方案?

【问题讨论】:

    标签: java spring junit


    【解决方案1】:

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

    【讨论】:

    • 即使已经一年了:非常感谢!解决了我遇到的一个奇怪的测试问题。 :-)
    • 太棒了。时不时地解决这个问题,那个问题解决得很好
    • 我必须使用 @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) 来关闭我的测试中的上下文。
    【解决方案2】:

    你是如何进行测试的?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多