2011-06-23 21 views
47

我有一個服務,在HttpServletRequest對象上做了一些工作,特別是使用request.getParameterMap和request.getParameter構造一個對象。從url字符串中創建一個模擬的HttpServletRequest?

我想知道是否有采取提供的網址,在一個字符串的形式直接的方式,說

String url = "http://www.example.com/?param1=value1&param"; 

,並輕鬆地將其轉換爲一個HttpServletRequest對象,這樣我可以測試它在我單元測試?或者至少只是爲了讓request.getParameterMap和request.getParameter工作正常?

回答

29

Spring的彈簧測試模塊中有MockHttpServletRequest

如果您使用的是maven,您可能需要將相應的依賴關係添加到您的pom.xml。您可以在mvnrepository.com找到彈簧測試。

+0

這肯定看起來像做最簡單的方法。非常感謝! – Anthony

+2

我無法得到這個工作。它應該如何使用? – varunl

+0

'spring-test'的依賴關係的數量已經很瘋狂了。已經偶然發現了一些碰撞:( –

2

您通常會在集成測試中測試這些類型的東西,這些測試實際上會連接到服務。要進行單元測試,您應該測試servlet的doGet/doPost方法使用的對象。

一般而言,您不希望在servlet方法中擁有太多代碼,您可能希望創建一個bean類來處理操作並將自己的對象傳遞給它,而不是servlet API對象。嘲笑

+1

然後,爲什麼你會通過機會增加你的測試覆蓋率(即你的代碼健壯性),僅僅是因爲該方法碰巧需要某種類型的參數作爲輸入? – pap

+1

這取決於你是否想要要單元測試servlet API還是試圖單元測試你自己的代碼? –

+3

「一般情況下」你不想在你的servlet方法中有任何代碼,實際上,你總是會這樣做,而且你將有助手類,實用方法,解析,驗證,模型翻譯,甚至有時甚至是商業邏輯(恐怖!),並且既然你做了,你會想對它們進行單元測試,因此你需要模擬servlet請求到創建定義良好的測試場景,模擬servlet API恰恰是測試它的對象,它完全從測試用例中刪除它。 – pap

35

最簡單的方法的HttpServletRequest

  1. 創建一個匿名子類:

    HttpServletRequest mock = new HttpServletRequest() 
    { 
        private final Map<String, String[]> params = /* whatever */ 
    
        public Map<String, String[]> getParameterMap() 
        { 
         return params; 
        } 
    
        public String getParameter(String name) 
        { 
         String[] matches = params.get(name); 
         if (matches == null || matches.length == 0) return null; 
         return matches[0]; 
        } 
    
        // TODO *many* methods to implement here 
    }; 
    
  2. 使用jMockMockito,或其他一些通用的嘲諷框架:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock 
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito 
    
  3. 使用HttpUnit的ServletUnit,不要模擬請求。

23

這是如何使用MockHttpServletRequest:

// given 
MockHttpServletRequest request = new MockHttpServletRequest(); 
request.setServerName("www.example.com"); 
request.setRequestURI("/foo"); 
request.setQueryString("param1=value1&param"); 

// when 
String url = request.getRequestURL() + '?' + request.getQueryString(); // assuming there is always queryString. 

// then 
assertThat(url, is("http://www.example.com:80/foo?param1=value1&param")); 
+1

使用這個MockHttpServletRequest實際上做的工作,因爲我只是需要一個功能齊全的HttpServletRequest – Silentbang

+0

請注意,當設置queryString的參數Map不會自動更新MockHttpServletRequest中。因此,如果您在代碼中使用request.getParameter(),則必須首先明確地將它設置爲測試設置,即使它看起來可能看起來多餘。 – inovaovao