rustyx
rustyx

Reputation: 85341

SpringJUnit4ClassRunner does not close the Application Context at the end of JUnit test case

I'm using SpringJUnit4ClassRunner in my JUnit 4 tests like this:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
public class MyTest {
    @Autowired
    private ConfigurableApplicationContext context;
    @Test
    public void test1() {
    . . .
    }
    @Test
    public void test2() {
    . . .
    }
    . . .
}

However, at the end of this test case the application context is not closed. I would like to have the application context closed at the end of the test case (NOT at the end of each individual unit-test in the test case).

So far I could come up with this work-around:

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

Is there a better solution?

Upvotes: 32

Views: 17470

Answers (2)

gkamal
gkamal

Reputation: 21000

You can add the @DirtiesContext(classMode=ClassMode.AFTER_CLASS) at the class level and the context will get closed once all the tests in the methods are done. You will get the same functionality as your current code.

Upvotes: 75

Tomasz Nurkiewicz
Tomasz Nurkiewicz

Reputation: 340733

How are you running your tests?

Spring is not closing the context by default on test case close. Instead it install shutdown hook that is run when JVM exits. This obscure mechanism was introduces to allow test context caching, which is a good thing.

From my experience this works correctly when JUnit tests are run both from my IDE and from maven-surefire-plugin. Your solution is a bit of a hack and certainly should not be needed.

Upvotes: 3

Related Questions