在Spring测试中使用请求作用域的Bean
在Spring测试中使用请求作用域的Bean
我想在我的应用程序中使用请求范围的bean。我使用JUnit4进行测试。如果我尝试在测试中创建一个这样的bean:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring/TestScopedBeans-context.xml" }) public class TestScopedBeans { protected final static Logger logger = Logger .getLogger(TestScopedBeans.class); @Resource private Object tObj; @Test public void testBean() { logger.debug(tObj); } @Test public void testBean2() { logger.debug(tObj); } }
使用以下bean定义:
我得到了以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gov.nasa.arc.cx.sor.query.TestScopedBeans': Injection of resource fields failed; nested exception is java.lang.IllegalStateException: No Scope registered for scope 'request' <...SNIP...> Caused by: java.lang.IllegalStateException: No Scope registered for scope 'request'
所以我找到了这个博客,看起来很有帮助:
[http://www.javathinking.com/2009/06/no-scope-registered-for-scope-request_5.html](http://www.javathinking.com/2009/06/no-scope-registered-for-scope-request_5.html)
但是我注意到他使用的是Spring 3.0中已经过时的AbstractDependencyInjectionSpringContextTests。 我目前使用的是Spring 2.5,但是我认为将这个方法切换为使用AbstractJUnit4SpringContextTests应该不会太困难,就像文档中建议的那样(好吧,文档链接到的是3.8版本,但我正在使用4.4版本)。 所以我将测试类改为扩展AbstractJUnit4SpringContextTests...错误消息相同。 问题也相同。 现在我想要覆盖的prepareTestInstance()方法也未定义。 好吧,也许我会将这些registerScope调用放在其他地方... 因此,我阅读了更多关于TestExecutionListeners的信息,并认为这可能更好,因为我不想继承spring包结构。 所以我将我的测试类更改为:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring/TestScopedBeans-context.xml" }) @TestExecutionListeners({}) public class TestScopedBeans {
我期望我将不得不创建一个自定义的listener,但是当我运行它时,它却起作用了! 太好了,但是为什么? 我没有看到任何默认的listener注册请求范围或会话范围,为什么会这样呢? 没有任何东西表明我想要那个,这可能不是一个用于Spring MVC代码的测试...