2012-12-03 23 views
15

के साथ वसंत एमवीसी 3.1 एकीकरण परीक्षण मैं एकीकरण परीक्षण चलाने के लिए 3.1 संस्करण में नया spring-test का उपयोग कर रहा हूं। यह वास्तव में अच्छी तरह से काम करता है लेकिन मैं सत्र को काम करने के लिए नहीं कर सकता। मेरा कोड:सत्र समर्थन

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration("src/main/webapp") 
@ContextConfiguration({"classpath:applicationContext-dataSource.xml", 
     "classpath:applicationContext.xml", 
     "classpath:applicationContext-security-roles.xml", 
     "classpath:applicationContext-security-web.xml", 
     "classpath:applicationContext-web.xml"}) 
public class SpringTestBase { 

    @Autowired 
    private WebApplicationContext wac; 
    @Autowired 
    private FilterChainProxy springSecurityFilterChain; 
    @Autowired 
    private SessionFactory sessionFactory; 

    protected MockMvc mock; 
    protected MockHttpSession mockSession; 

    @Before 
    public void setUp() throws Exception { 
     initDataSources("dataSource.properties"); 

     mock = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); 
     mockSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString()); 
    } 

    @Test 
    public void testLogin() throws Exception { 
     // this controller sets a variable in the session 
     mock.perform(get("/") 
      .session(mockSession)) 
      .andExpect(model().attributeExists("csrf")); 

     // I set another variable here just to be sure 
     mockSession.setAttribute(CSRFHandlerInterceptor.CSRF, csrf); 

     // this call returns 403 instead of 200 because the session is empty... 
     mock.perform(post("/setup/language") 
      .session(mockSession) 
      .param(CSRFHandlerInterceptor.CSRF, csrf) 
      .param("language", "de")) 
      .andExpect(status().isOk()); 
    } 
} 

मेरा अनुरोध प्रत्येक अनुरोध में खाली है, मुझे नहीं पता क्यों।

संपादित करें: अंतिम जोर विफल रहा है: andExpect(status().isOk());। यह 200 के बजाय 403 लौटाता है।

+0

कौन सा दावा विफल हो रहा है? –

+0

अंतिम: 'और एक्सपेक्ट (स्टेटस()। IsOk()); क्योंकि मैं एक चर के लिए सत्र की जांच करता हूं जिसे सेट किया जाना चाहिए, लेकिन सत्र खाली है इसलिए यह वर्जित हो जाता है। – islon

+0

यह भी देखें [वसंत 3.2 नए एमवीसी परीक्षण के साथ उपयोगकर्ता को कैसे लॉगिन करें] (http://stackoverflow.com/questions/14308341/how-to-login-a-user-with-spring-3-2-new-mvc -परिक्षण)। – Arjan

उत्तर

9

मैंने इसे कुछ हद तक गोल किया है - हालांकि काम करता है।

this.mockMvc.perform(post("/j_spring_security_check") 
      .param("j_username", "fred") 
      .param("j_password", "fredspassword")) 
      .andExpect(status().isMovedTemporarily()) 
      .andDo(new ResultHandler() { 
       @Override 
       public void handle(MvcResult result) throws Exception { 
        sessionHolder.setSession(new SessionWrapper(result.getRequest().getSession())); 
       } 
      }); 

SessionHolder, अपने कस्टम वर्ग है सिर्फ सत्र आयोजित करने की:

क्या मैंने किया था वसंत-सुरक्षा प्रासंगिक सुरक्षा विशेषताओं सत्र में आबादी के साथ एक सत्र बनाने तथा फिर उस सत्र इस तरह हड़पने जाने के लिए था
private static final class SessionHolder{ 
    private SessionWrapper session; 


    public SessionWrapper getSession() { 
     return session; 
    } 

    public void setSession(SessionWrapper session) { 
     this.session = session; 
    } 
} 

और SessionWrapper अन्य वर्ग MockHttpSession से विस्तार MockHttpSession है, सिर्फ इसलिए कि सत्र विधि की आवश्यकता है:

private static class SessionWrapper extends MockHttpSession{ 
    private final HttpSession httpSession; 

    public SessionWrapper(HttpSession httpSession){ 
     this.httpSession = httpSession; 
    } 

    @Override 
    public Object getAttribute(String name) { 
     return this.httpSession.getAttribute(name); 
    } 

} 
इन रों साथ

और, अब आप सत्रहोल्डर से सत्र ले सकते हैं और उदाहरण के लिए बाद के तरीकों को निष्पादित कर सकते हैं। मेरे मामले में:

mockMvc.perform(get("/membersjson/1").contentType(MediaType.APPLICATION_JSON).session(sessionHolder.getSession())) 
      .andExpect(status().isOk()) 
      .andExpect(content().string(containsString("OneUpdated"))); 
+0

धन्यवाद, यह काम करता है! – islon

21

UPDATED उत्तर:

यह एक नई विधि "sessionAttrs" बिल्डर में जोड़ा गया है लगता है (mvc controller test with session attribute देख)

Map<String, Object> sessionAttrs = new HashMap<>(); 
sessionAttrs.put("sessionAttrName", "sessionAttrValue"); 

mockMvc.perform(MockMvcRequestBuilders.get("/uri").sessionAttrs(sessionAttrs)) 
     .andDo(print()) 
     .andExpect(MockMvcResultMatchers.status().isOk()); 

पुराने उत्तर:

सहायक वर्गों का उपयोग किए बिना एक ही परिणाम प्राप्त करने के लिए यहां एक आसान समाधान है, यह मेरे कोड का एक स्निपेट है (मुझे नहीं पता कि ये विधियां पहले से ही उपलब्ध हैं या नहीं Iju Kunjummen ने उत्तर दिया:


     HttpSession session = mockMvc.perform(post("/login-process").param("j_username", "user1").param("j_password", "user1")) 
      .andExpect(status().is(HttpStatus.FOUND.value())) 
      .andExpect(redirectedUrl("/")) 
      .andReturn() 
      .getRequest() 
      .getSession();    

     Assert.assertNotNull(session); 

     mockMvc.perform(get("/").session((MockHttpSession)session).locale(Locale.ENGLISH)) 
      .andDo(print()) 
      .andExpect(status().isOk()) 
      .andExpect(view().name("logged_in")); 
 
+1

यह निश्चित रूप से स्वीकार्य उत्तर होना चाहिए! वर्तमान स्वीकृत उत्तर यह प्राप्त करने के लिए एक बहुत गंदा हैक है। –

+0

यह वास्तव में बेहतर समाधान http://stackoverflow.com/a/26341909/2674303 – gstackoverflow

+0

मैं इस समाधान को लागू करने में समस्या आ रही है। मुझे निम्नलिखित अपवाद मिल रहा है 'NestedServletException: अनुरोध प्रसंस्करण विफल रहा; नेस्टेड अपवाद java.lang.ArrayIndexOutOfBoundsException: -1' है। कोई विचार क्या हो सकता है? – JackB