2014-05-16 61 views
2

我有以下控制器和我想打一個JUnit測試就可以了,春Junit的控制器不要嘲笑工作

@RequestMapping(value = "/path", method = RequestMethod.Get) 
public String getMyPath(HttpServletRequest request, Model model) { 

    Principal principal = request.getUserPrincipal(); 
    if (principal != null) { 
     model.addAttribute("username", principal.getName()); 
    } 
    return "view"; 
} 

JUnit的方法如下所示:

@Test 
public void testGetMyPath() throws Exception { 

    when(principalMock.getName()).thenReturn("someName"); 

    this.mockMvc.perform(get("/path")).andExpect(status().isOk()); 
} 

principalMock聲明如下這個:

@Mock 
private Principal principalMock; 

問題是我得到NullPointerException在這一行調用getName()方法在pri上ncipal。

model.addAttribute("username", principal.getName()); 
+0

爲什麼是MockHttpServletRequest您在請求映射爲GET時在測試中發佈? – geoand

+0

我編輯了問題, – Jones

+0

好的,我會檢查它! – geoand

回答

1

本金的嘲弄已經完全沒有任何作用,因爲它不能發揮作用的任何地方(控制器不使用任何依賴注入產生的本金,但它使用HttpServletRequest)。

您需要將您的測試更改爲類似如下:

this.mockMvc.perform(get("/path").principal(principalMock)).andExpect(status().isOk()); 

這會起作用,因爲模擬本金將被傳遞到實際將傳遞給控制器​​的方法