2011-02-27 8 views
28

Tengo un bean de ámbito de sesión que contiene datos de usuario por sesión http. Me gustaría escribir un caso de prueba de Junit para probar el bean con ámbito de la sesión. Me gustaría escribir el caso de prueba para que pueda probar que los beans se están creando por sesión. Cualquier puntero como la forma de escribir tal caso de prueba Junit?Spring Beans de ámbito de sesión de prueba utilizando Junit

Respuesta

28

Para utilizar solicitud de sesión y alcances de prueba de unidad es necesario:

  • registrar estos ámbitos en el contexto de aplicación
  • Crear sesión de simulacro y solicitar
  • registro de solicitud de simulacro a través RequestContextHolder

Algo como esto (suponga que utiliza Spring TestContext para ejecutar sus pruebas): 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; 
    } 
} 

Ahora puede utilizar estos métodos en su código de prueba:

startSession(); 
startRequest(); 
// inside request 
endRequest(); 
startRequest(); 
// inside another request of the same session 
endRequest(); 
endSession(); 
+0

Gracias por la explicación detallada. Muy útil. – Shamik

27

me encontré con este enfoque más simple, pensé que también podría publicar aquí en caso de que otros lo necesitan.

<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> 

Con este enfoque, usted no tiene que burlarse de cualquier objeto de solicitud/sesión.

Fuente: http://tarunsapra.wordpress.com/2011/06/28/junit-spring-session-and-request-scope-beans/

+0

Lo mismo se aplica al alcance de 'solicitud', simplemente use key = 'request' para los beans de ámbito de solicitud. – Zeus

9

Primavera 3.2 y más reciente proporciona soporte para la sesión/petición en ámbito de frijoles para las pruebas de integración

@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)); 
    } 
} 

Referencias:

+2

Después de agregar WebAppConfiguration tuve un error de initializationError que resolví agregando el servlet-api al archivo pom como se indica aquí: http://nickebbitt.wordpress.com/2013/12/20/spring-3-2-mvc -unit-testing-initializationerror-using-webappconfiguration/ – borjab

+1

Gracias, hizo el truco para mí. –

+0

Sugerencia: no use \ @WebAppConfiguration en combinación con \ @IntegrationTest. No funciona para mi –

Cuestiones relacionadas