2014-03-28 21 views
4

我想部分嘲諷Httpsession,但爲此我需要監視它而不是嘲笑它,而且它是一個接口,如果沒有請求對象已經被模擬,那麼它就是一個接口。無法把間諜放在HttpSession/Mockito

請大家幫忙。

換句話說,如何獲得HttpSession的對象而沒有HttpServletRequest對象。

更詳細::

有一個servlet我想測試,servlet的有會議並提出「loginBean」(其中包含用戶的相關信息loged)的內部會議上,我已經嘲笑和做工精細,現在在GUI級別中,有2個選項卡,DetailSet1,detailsS​​et2,當您輸入DetailSet1的數據時,它會保存在會話中,並且還會執行一些業務邏輯,現在涉及到DetailsS​​et2,您已經在會話中擁有DetailSet1,它需要將數據保存在數據庫中。不,這很明顯,我必須模擬HttpSession,因爲我從容器外部運行單位案例,但是存儲的數據也在Httpsession之內,如果我嘲笑這些單元格,它會挫敗測試目的。回到我剛開始的時候,我需要Httpsession對象來返回我嘲笑它的模擬數據,並且假設它的行爲與其他任何正常的HttpSession對象一樣。就像,如果我做session.setAttribute(「名」,「維韋克),然後session.getAttribute("name")應該return "Vivek"後,但在嘲笑對象的情況下,它返回null爲什麼呢?因爲我還沒有爲getAttribute("name")嘲笑的行爲。我如果真的很抱歉我仍然無法讓任何人都明白我的要求。

在簡單的文字部分嘲弄上HttpSession

+1

描述你的使用情況多一點。你想要達到什麼目的? –

+0

我想部分模擬HttpSession。 – Vivek

+1

正如我所說,描述你的**使用案例** - 不是你在技術上想要做什麼,而是你想要做什麼*。你在測試嗎?你的問題的大背景是什麼? –

回答

5

好的我明白了。你真的沒有訪問真正的會話對象,你不會做任何間諜。你需要你的自制假(假):

public class MockHttpSession implements HttpSession { 
    Map<String, Object> map = new HashMap<>(); 

    @Override 
    public Object getAttribute(String name) { 
    return map.get(name); 
    } 

    @Override 
    public void setAttribute(String name, Object value) { 
    map.put(name, value); 
    } 


    // implement rest of the methods you will use 

,然後在您的測試,你將有:

when(request.getSession()).thenReturn(new MockHttpSession()); 
+0

謝謝,已經嘗試過了,那很奏效,非常感謝@Pbielicki – Vivek

3

只是實現該接口的HttpSession自己(我將其命名爲FakeHttpSession的基礎上,提出了名稱在Martin Fowlers bliki)。

然後你使用Mockito創建一個實例和間諜。

+0

謝謝Jens,看起來像這樣可能會工作,讓我試試看,bbl :) – Vivek