2011-09-20 40 views
0

它是我的理解,即單元測試彈簧控制器的一種有效方法是過於簡單地實例化(需要的控制器的)新實例並直接測試控制器方法。不打擾模擬請求等,因爲春天本身確實需要測試。使用只返回視圖名稱的方法來測試彈簧3控制器的單元

但是,我的許多控制器方法只是將視圖名稱作爲單個字符串返回,我想測試模型本身是否具有正確的參數和數據。

我是否需要更改方法以便返回ModelAndView,以便我可以在單元測試中訪問模型?我的方法是否應該這樣做(返回一個模型和視圖)呢?

當我在控制器方法內創建一個新的ModelAndView時,現有的Model是否被覆蓋?

回答

2

我會盡量回答你的一些問題。

關於對控制器進行單元測試,有時我發現需要添加Spring的模擬請求和響應,因爲某些彈簧功能期望請求上下文中的請求和響應。

class MyTest { 
    private MockHttpServletRequest request; 
    private MockHttpServletResponse response; 

    @BeforeMethod(alwaysRun = true) 
    public void setup() { 
     request = new MockHttpServletRequest(); 
     response = new MockHttpServletResponse(); 
     controller = new Controller(/*inject dependencies here*/); 
    } 
} 

這是很容易弄清楚,因爲如果它們不存在,你會得到一個非常具體的錯誤,指出請求或響應不在範圍內。

與模型相關,我發現返回一個ModelAndView更容易,並添加了一些檢查輸出參數和視圖名稱的測試。

public void shows_xxx_index_view { 
    assertThat(modelAndView.getViewName(), equalTo("controller/index")); 
} 

public void model_contains_search_results { 
    assertThat(modelAndView.getModelMap().get("searchResults"), equalTo(expected_results)); 
} 

而且我不知道模型是否被覆蓋。

這是我從一個小項目中獲得的經驗,所以我決不是專家,但我發現這種方法很有用。

+0

謝謝! (分鐘) – NimChimpsky

相關問題