2011-12-15 58 views
1

我有獲取存儲在會話(使用FacesContext的)的對象如下彈簧服務方法:如何在單元測試中使用會話?

(MyObject)((HttpServletRequest) FacesContext 
       .getCurrentInstance().getExternalContext().getRequest()) 
       .getSession().getAttribute("myObject"); 

,我希望把該對象在會話中的單元測試調用所述方法之前。

所以我想在這個職位的解決方案:

Spring Test session scope bean using Junit

,並在我的測試方法,我把對象在會話調用服務之前,但服務拋出試圖讓對象時異常從會議中,我想這是因爲facescontext不可用,你認爲如何?

我正在使用彈簧,Junit,JSF2,請指教,謝謝。

+0

你是如何在生產代碼訪問會話?注射?來自HTTP請求?會話範圍? – 2011-12-15 11:44:33

+1

這裏的示例 - http://stackoverflow.com/questions/5136944/spring-test-session-scope-bean-using-junit關於使用會話 – 2011-12-15 11:53:13

+0

問題更新。 – 2011-12-15 11:58:47

回答

1

我假設你在談論HttpSession。

創建一個模擬會話,告訴模擬會話在其getAttribute方法被調用時使用被測對象使用的名稱時總是返回該對象,並將該模擬會話而不是真實的會話傳遞給被測對象。模擬API,如Mockito或EasyMock將有助於做到這一點。

編輯:假設你要測試的方法是這樣的:

public String foo() { 
    // some lines of code 
    MyObject o = 
     (MyObject)((HttpServletRequest) FacesContext 
      .getCurrentInstance().getExternalContext().getRequest()) 
      .getSession().getAttribute("myObject"); 
    // some more lines of code, using o. 
} 

你可以重構它是這樣的:

public String foo() { 
    // some lines of code 
    MyObject o = getMyObjectFromSession(); 
    // some more lines of code, using o. 
} 

protected MyObject getMyObjectFromSession() { 
    return (MyObject)((HttpServletRequest) FacesContext 
      .getCurrentInstance().getExternalContext().getRequest()) 
      .getSession().getAttribute("myObject"); 
} 

然後你可以使用模擬框架做一些像這個(僞代碼):

// mockFoobar is the object to test. We just mock its getMyObjectFromSession method 
FooBar mockFoobar = mock(Foobar.class); 
MyObject objectInSession = new MyObject(); 
when(mockFoobar.getMyObjectFromSession()).thenReturn(objectInSession); 

String s = mockFoobar.foo(); 
assertEquals("expected result", s); 
0

spring-mock添加到您的測試類路徑中h給你org.springframework.mock.web.MockHttpSession。這是一個非常簡單的實現,您可以在沒有Java EE容器的情況下使用new創建。

該JAR還包含嘲笑的請求,響應和其他一切。

另一種解決方案是使用MockRunner,它也是這樣做的。

1

使用Spring 3.2,這是很容易

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(...) 
@WebAppConfiguration 
public class SessionTest { 

    @Autowired 
    MockHttpSession session; 


    @Test 
    public void sessionAttributeTest() throws Exception { 

     MyObject myObject = session.getAttribute("myObject"); 
     ... 

    } 
} 

的更多信息:Request and Session Scoped Beans