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() {
. . .
}
. . .
}
有更好的解决办法吗
# 1 楼答案
你是如何进行测试的
默认情况下,Spring不会在测试用例关闭时关闭上下文。相反,它安装了在JVM退出时运行的关闭钩子。引入这种模糊的机制是为了允许测试上下文caching,这是一件好事
根据我的经验,当JUnit测试从我的IDE和
maven-surefire-plugin
运行时,这是正确的。你的解决方案有点像黑客,当然不需要# 2 楼答案
您可以在类级别添加^{} ,一旦方法中的所有测试完成,上下文就会关闭。您将获得与当前代码相同的功能