web-dev-qa-db-fra.com

Bean de session de test de printemps à l'aide de junit

J'ai une session SPOPED Bean qui détient des données utilisateur par session http. Je voudrais écrire un cas de test Junit pour tester la session SPOPED Bean. Je voudrais écrire le cas de test de telle sorte qu'il puisse prouver que les haricots sont créés par session. Tout pointeur comme comment écrire un tel cas de test Junit?

32
Shamik

Afin d'utiliser des applications de demande et de session dans un test de l'unité, vous devez:

  • enregistrer ces scopes dans le contexte de l'application
  • créer une session simulée et demande
  • enregistrer la demande simulée via RequestContextHolder

Quelque chose comme ça (supposons que vous utilisez le printemps testContext pour exécuter vos tests): abstractSessionTest.xml:

<beans ...>
    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="session">
                    <bean class="org.springframework.web.context.request.SessionScope" />
                </entry>
                <entry key="request">
                    <bean class="org.springframework.web.context.request.RequestScope" />
                </entry>
            </map>
        </property>
    </bean>
</beans>

.

@ContextConfiguration("abstractSessionTest.xml")
public abstract class AbstractSessionTest {
    protected MockHttpSession session;
    protected MockHttpServletRequest request;

    protected void startSession() {
        session = new MockHttpSession();
    }

    protected void endSession() {
        session.clearAttributes();
        session = null;
    }

    protected void startRequest() {
        request = new MockHttpServletRequest();
        request.setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
    }

    protected void endRequest() {
        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).requestCompleted();
        RequestContextHolder.resetRequestAttributes();
        request = null;
    }
}

Vous pouvez maintenant utiliser ces méthodes dans votre code de test:

startSession();
startRequest();
// inside request
endRequest();
startRequest();
// inside another request of the same session
endRequest();
endSession();
30
axtavt

Je suis tombé sur cette approche plus simple, pensais que je pourrais aussi poster ici au cas où d'autres en ont besoin.

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

Avec cette approche, vous n'avez pas à se moquer d'objets de demande/session.

Source: http://tarunsapra.wordpress.com/2011/06/28/junit-spring-session-and-Request-Scope-Beans/

30
kctang

Spring 3.2 et plus récente fournit une prise en charge des haricots Session/Demander Scoped pour des tests d'intégration

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@WebAppConfiguration
public class SampleTest {

    @Autowired WebApplicationContext wac;

    @Autowired MockHttpServletRequest request;

    @Autowired MockHttpSession session;    

    @Autowired MySessionBean mySessionBean;

    @Autowired MyRequestBean myRequestBean;

    @Test
    public void requestScope() throws Exception {
        assertThat(myRequestBean)
           .isSameAs(request.getAttribute("myRequestBean"));
        assertThat(myRequestBean)
           .isSameAs(wac.getBean("myRequestBean", MyRequestBean.class));
    }

    @Test
    public void sessionScope() throws Exception {
        assertThat(mySessionBean)
           .isSameAs(session.getAttribute("mySessionBean"));
        assertThat(mySessionBean)
           .isSameAs(wac.getBean("mySessionBean", MySessionBean.class));
    }
}

Les références:

11
MariuszS