A recent discussion in the #spring channel on Kotlin Slack pointed out that issues arise when using @DirtiesContext to evict an ApplicationContext from the cache between test methods if the test class is executed with JUnit Jupiter and @TestInstance(PER_CLASS) semantics.
Analysis
Constructor injection for Spring-managed components will not work properly if @DirtiesContext is used to evict the test's ApplicationContext before or after test methods.
The reason is that the test instance will retain references to beans that came from a (now) closed ApplicationContext, and dependency injection will not occur again (to reset the references) since the constructor will only be invoked once.
To use @DirtiesContext before or after methods, one must allow dependencies from Spring to be injected via fields or setter/configuration methods.
Deliverables
Document this in the Testing chapter of the reference manual
Sam Brannen opened SPR-17654 and commented
Overview
A recent discussion in the #spring channel on Kotlin Slack pointed out that issues arise when using
@DirtiesContext
to evict anApplicationContext
from the cache between test methods if the test class is executed with JUnit Jupiter and@TestInstance(PER_CLASS)
semantics.Analysis
Constructor injection for Spring-managed components will not work properly if
@DirtiesContext
is used to evict the test'sApplicationContext
before or after test methods.The reason is that the test instance will retain references to beans that came from a (now) closed
ApplicationContext
, and dependency injection will not occur again (to reset the references) since the constructor will only be invoked once.To use
@DirtiesContext
before or after methods, one must allow dependencies from Spring to be injected via fields or setter/configuration methods.Deliverables
Affects: 5.0.12
Referenced from: commits bd9d333, cf56506
The text was updated successfully, but these errors were encountered: