2015-09-23 4 views
0

Я хочу протестировать, что сессия имеет правильное значение TTL в разное время запроса. Как мне это сделать?Как я могу проверить наличие конкретных данных в сеансе?

@ThreadSafe 
@RestController 
@SessionAttributes("TTL") 
@RequestMapping("/rest/") 
public class MessageRestController { 
    private static final String TTL = "TTL"; 

    @Secured("ROLE_USER") 
    @RequestMapping("/message") 
    public List<String> getMessage(Model model) { 
     final Optional<String> message = messageService.getMessage(); 
     if (message.isPresent()) { 
      return Collections.singletonList(message.get()); 
     } else { 
      final Long currentTtl = (Long) model.asMap().get(TTL); 
      if (currentTtl == null || Instant.ofEpochMilli(currentTtl).isBefore(Instant.now())) { 
       messageService.generateNewMessage(); 
       model.addAttribute(TTL, Instant.now().plusMillis(ttl).toEpochMilli()); 
      } 

      return Collections.emptyList(); 
     } 
    } 
} 

я пытался сделать, как этот

mockMvc.perform(get("/rest/message").sessionAttr("TTL", Instant.now().minusSeconds(60).toEpochMilli())) 
      .andExpect(status().isOk()) 
      .andExpect(model().attribute("TTL", Matchers.greaterThan(Instant.now().toEpochMilli()))); 

Он бросает исключение java.lang.AssertionError: No ModelAndView found. Действительно, у меня нет ModelAndView. Можно ли проверить атрибут сеанса?

ответ

0

Это можно проверить, как это

MockHttpSession session = new MockHttpSession(); 
    session.putValue("TTL", Instant.now().minusSeconds(60).toEpochMilli()); 

mockMvc.perform(get("/rest/message").session(session)) 
     .andExpect(status().isOk()); 

assertThat((Long) session.getAttribute("TTL"), Matchers.greaterThan(Instant.now().toEpochMilli()));