2015-06-15 63 views
0

HttpSession中我需要測試以下控制方法:嘲諷使用的Mockito

@RequestMapping(value="/addLocation") 
public String addLocation(HttpServletRequest request, HttpSession session) { 

    String location = (String) request.getParameter("plz_ort"); 
    String radius = (String) request.getParameter("umkreis"); 

    ((ArrayList<String>) session.getAttribute("queryTopics")).clone();   

    ... 
} 

爲此我寫了使用的Mockito和JUnit

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 

import java.util.ArrayList; 

import org.junit.Before; 
import org.junit.Ignore; 
import org.junit.Test; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.mock.web.MockHttpSession; 
import org.springframework.test.web.servlet.MockMvc; 
import org.springframework.test.web.servlet.setup.MockMvcBuilders; 

public class MyControllerTest { 


    @InjectMocks 
    private MyController myController; 

    private MockMvc mockMvc; 

    @InjectMocks 
    MockHttpSession session; 

    @Before 
    public void setup() { 

     // Process mock annotations 
     MockitoAnnotations.initMocks(this); 

     // Setup Spring test in standalone mode 
     this.mockMvc = MockMvcBuilders.standaloneSetup(MyController) 
       .build(); 

    } 

    @Test 
    public void addLocation_StatusOK() throws Exception { 
     session.setAttribute("queryTopics", new ArrayList<String>(0)); 

     this.mockMvc.perform(
       post("/addLocation") 
         .param("plz_ort", "PLZ ORT") 
         .param("umkreis", "5")) 
       .andExpect(
         status().isOk()); 

    } 

} 

這個測試類正如你可以看到我需要模擬會話運行此測試時。 當我通過代碼進行調試並停在行session.setAttribute("queryTopics", new ArrayList<String>(0));時,會話對象爲[email protected](包含屬性哈希映射{queryTopics=[]}),所以我認爲沒關係。 但是,我在((ArrayList<String>) session.getAttribute("queryTopics")).clone();行中的下一個斷點的會話對象是[email protected]

至少它是正確的類型(MockHttpSession),但它有一個不同的ID,因此它實際上是一個全新的對象,因此不包含來自測試的會話屬性。

你能幫我解決這個問題嗎?

回答

3

模擬MVC將創建一個spring模擬請求和一個spring模擬會話,然後調用你的控制器方法。爲了設置一些國家在會議上被稱爲控制器的方法之前,你需要使用configure the mock request建設者:

public class MyControllerTest { 

    @InjectMocks 
    private MyController myController; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     // Process mock annotations 
     MockitoAnnotations.initMocks(this); 

     // Setup Spring test in standalone mode 
     this.mockMvc = MockMvcBuilders.standaloneSetup(MyController) 
       .build(); 

    } 

    @Test 
    public void addLocation_StatusOK() throws Exception { 
     this.mockMvc.perform(
       post("/addLocation") 
         .param("plz_ort", "PLZ ORT") 
         .param("umkreis", "5") 
         .sessionAttr("queryTopics", new ArrayList<String>(0)) 
       .andExpect(
         status().isOk()); 
    } 
} 
+0

工程就像一個魅力,太感謝你了! – Erando