Description
Eberhard Wolff opened SPR-4632 and commented
Status Quo
The loadContext(\*\)
methods in AbstractGenericContextLoader
and AbstractGenericWebContextLoader
invoke AnnotationConfigUtils.registerAnnotationConfigProcessors(context)
.
The result is that @Autowired
, @Resource
, @Inject
, etc. all work by default, even if annotation-driven dependency injection is not explicitly configured in the test's ApplicationContext
. Consequently, if a developer is not aware of this, then errors related to the lack of explicit annotation-driven DI support in production configuration will not be noticed until after testing which is typically undesirable.
Note, however, that this unexpected behavior only applies to XML-based configuration. With JavaConfig, an AnnotatedBeanDefinitionReader
(used internally by AnnotationConfigContextLoader
and AnnotationConfigWebContextLoader
) automatically registers the annotation config processors.
Furthermore, BeanPostProcessors
may inadvertently be applied to the test instance -- even though the test is not truly a bean in the ApplicationContext
. This leads to potentially problematic behavior such as accidental proxying of the test instance, as described in #14113.
Deliverables
- As suggested in comments for this issue, create an
ApplicationContext
dedicated solely to the test instance (for the purpose of dependency injection and bean initialization) and set theparent
of that context to theApplicationContext
loaded by the TCF. - Stop invoking
AnnotationConfigUtils.registerAnnotationConfigProcessors()
in:-
AbstractGenericContextLoader
-
AbstractGenericWebContextLoader
-
- Ensure that child contexts are properly closed with regard to context caching in the TCF.
Original Issue Summary
Do not enable annotation-driven DI for the entire ApplicationContext in the TestContext framework
Original Proposal
It would be better if the TestContext framework (TCF) only enabled annotation-driven dependency injection for test instances and not for the entire ApplicationContext
.
Affects: 2.5.2
Attachments:
Issue Links:
- Spring Test should not modify the application context under test [SPR-8503] #13149 Spring Test should not modify the application context under test ("is duplicated by")
- Support WebApplicationContext hierarchies in the TestContext Framework [SPR-9863] #14496 Support WebApplicationContext hierarchies in the TestContext Framework
- Provide support for context hierarchies in the TestContext Framework [SPR-5613] #10284 Provide support for context hierarchies in the TestContext Framework
- Support 'throw-away' context for a test class [SPR-13722] #18295 Support 'throw-away' context for a test class
- Provide mechanism for disabling automatic annotation-driven autowiring in tests [SPR-6050] #10719 Provide mechanism for disabling automatic annotation-driven autowiring in tests
- Test instances should not be proxied in the TestContext framework [SPR-9478] #14113 Test instances should not be proxied in the TestContext framework
6 votes, 6 watchers