2015-06-15 2 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();   

    ... 
} 

Therefor Я написал тестовый класс, используя 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), но у него есть другой идентификатор, поэтому на самом деле это совершенно новый объект и, следовательно, не содержит атрибутов сеанса из теста.

Не могли бы вы помочь мне в этом?

ответ

3

Макет MVC создаст весенний макет запроса и весенний макет сессии, а затем вызовет ваш метод контроллера. Для того, чтобы установить какое-то состояние в сеансе перед методом контроллера называется, вам нужно 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

Смежные вопросы