Подтвердить что ты не робот

SpringJUnit4ClassRunner не закрывает контекст приложения в конце тестового примера JUnit

Я использую 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() {
    . . .
    }
    . . .
}

Есть ли лучшее решение?

4b9b3361

Ответ 1

Вы можете добавить @DirtiesContext(classMode=ClassMode.AFTER_CLASS) на уровне класса, и контекст будет закрыт после завершения всех тестов в методах. Вы получите ту же функциональность, что и текущий код.

Ответ 2

Как вы проводите тесты?

Spring не закрывает контекст по умолчанию при закрытии тестового примера. Вместо этого он устанавливает крюк остановки, который запускается при выходе из JVM. Этот неясный механизм вводил, чтобы разрешить тестовый контекст кеширование, что хорошо.

Из моего опыта это работает правильно, когда тесты JUnit запускаются как из моей IDE, так и из maven-surefire-plugin. Ваше решение немного взломано и, безусловно, не нужно.