Ответ 1
Вы можете добавить @DirtiesContext(classMode=ClassMode.AFTER_CLASS)
на уровне класса, и контекст будет закрыт после завершения всех тестов в методах. Вы получите ту же функциональность, что и текущий код.
Я использую SpringJUnit4ClassRunner в своих тестах JUnit 4 следующим образом:
@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() {
. . .
}
. . .
}
Есть ли лучшее решение?
Вы можете добавить @DirtiesContext(classMode=ClassMode.AFTER_CLASS)
на уровне класса, и контекст будет закрыт после завершения всех тестов в методах. Вы получите ту же функциональность, что и текущий код.
Как вы проводите тесты?
Spring не закрывает контекст по умолчанию при закрытии тестового примера. Вместо этого он устанавливает крюк остановки, который запускается при выходе из JVM. Этот неясный механизм вводил, чтобы разрешить тестовый контекст кеширование, что хорошо.
Из моего опыта это работает правильно, когда тесты JUnit запускаются как из моей IDE, так и из maven-surefire-plugin
. Ваше решение немного взломано и, безусловно, не нужно.