在Spring测试中使用请求作用域的Bean

14 浏览
0 Comments

在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代码的测试...

0