2015-06-01 4 views
1

Простой класс Test имеют следующие:Spring Junit с объектом сеанса - не отображается в контроллере

@Autowired 
private WebApplicationContext wac; 
@Autowired 
MockHttpSession session; 
private MockMvc mockMvc; 

@Before 
public void before() { 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
} 

@Test 
public void testSetSomeType() throws Exception { 
    this.session.putValue("PREV_PAGE_VAL", "FOO"); 
    System.out.println(this.session.getAttribute("PREV_PAGE_VAL")); //FOO is there, so far so good, but in the controller, its null 
    RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/setSomeType").param("someType", "ACCESS_ONLY").session(session) 
       .accept(MediaType.parseMediaType("application/json;charset=UTF-8")); 
    ResultActions result = this.mockMvc.perform(requestBuilder); 
     result.andExpect(MockMvcResultMatchers.status().isOk()); 
} 

..

А класс контроллера имеет следующие:

@RequestMapping(value = "/setSomeType", method = RequestMethod.POST) 
public @ResponseBody AppResponse setSomeType(@RequestParam(value = "someType") final String someType, final HttpSession session) { 
    //someType has "ACCESS_ONLY" 
    //session.getAttribute("PREV_PAGE_VAL"); is null, expecting FOO 
} 

Вопрос: Почему сеанс не имеет FOO? Чего не хватает? ..

ответ

2

Я не думаю, что Весна может автоматически связывать MockHttpSession (я также не знаю, где вы его оттуда).

Вы можете добавить его вручную.

RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/setSomeType") 
      .param("someType", "ACCESS_ONLY") 
      .accept(MediaType.parseMediaType("application/json;charset=UTF-8")) 
      .session(session); 

В качестве альтернативы, вы можете использовать sessionAttr(String, Object) добавить атрибуты сеанса в отдельности.

+0

huh! Позор мне, вот в чем проблема. Я использовал putValue и getAttribute. Думаю, мне просто нужен второй глаз :) Спасибо @Sotirios –