request scoped beans in spring testing

后端 未结 8 826
自闭症患者
自闭症患者 2020-11-30 00:54

I would like to make use of request scoped beans in my app. I use JUnit4 for testing. If I try to create one in a test like this:

@RunWith(SpringJUnit4Clas         


        
相关标签:
8条回答
  • 2020-11-30 01:27

    Test Request-Scoped Beans with Spring explains very well how to register and create a custom scope with Spring.

    In a nutshell, as Ido Cohn explained, it's enough to add the following to the text context configuration:

    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="request">
                    <bean class="org.springframework.context.support.SimpleThreadScope"/>
                </entry>
            </map>
        </property>
    </bean>
    

    Instead of using the predefined SimpleThreadScope, based on ThreadLocal, it's also easy to implement a Custom one, as explained in the article.

    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.beans.factory.ObjectFactory;
    import org.springframework.beans.factory.config.Scope;
    
    public class CustomScope implements Scope {
    
        private final Map<String , Object> beanMap = new HashMap<String , Object>();
    
        public Object get(String name, ObjectFactory<?> factory) {
            Object bean = beanMap.get(name);
            if (null == bean) {
                bean = factory.getObject();
                beanMap.put(name, bean);
            }
            return bean;
        }
    
        public String getConversationId() {
            // not needed
            return null;
        }
    
        public void registerDestructionCallback(String arg0, Runnable arg1) {
            // not needed
        }
    
        public Object remove(String obj) {
            return beanMap.remove(obj);
        }
    
        public Object resolveContextualObject(String arg0) {
            // not needed
            return null;
        }
    }
    
    0 讨论(0)
  • MariuszS' solution works, except I couldn't get the transaction committed properly.

    It seems the newly released 3.2 has finally made testing request/session scoped beans first class citizens. Here's a couple of blogs for more details.

    Rossen Stoyanchev's Spring Framework 3.2 RC1: Spring MVC Test Framework

    Sam Brannen's Spring Framework 3.2 RC1: New Testing Features

    0 讨论(0)
提交回复
热议问题