2014-11-24 1 views
0

У меня такие слои:Как создать сеанс весной Junit

Весенний контроллер -> Уровень сервиса -> Дао-слой (JPA).

Я хочу написать тестовые примеры услуг и контроллера. В другом Junit вызывается контроллер, контроллер будет вызывать службы, уровень сервиса получает информацию о базе данных и т. Д.

В этом случае я не хочу насмехаться, я хочу просто написать тестовый пример junit (я должен вызывать сервис и сервис должны получать реальные данные из базы данных).

У меня есть только одна проблема, служебный идентификатор пользователя get от сеанса. Я получаю сеанс с автообновленной аннотацией. Как создать фальшивый сеанс во время тестовых случаев?

пс Я думаю издеваться не для меня ... потому что я не привыкла издеваться над моей службы, я хочу, чтобы создать реальную Invoke контроллера с реальными данными дб ...

+0

Это фасоль с областью сеанса, в которой хранятся данные пользователя? – BzH

+0

Является ли ваш компонент уровня обслуживания объектно-ориентированным bean_? –

+0

Также вы заинтересованы в использовании «Spring MVC Test Framework»? –

ответ

2

Мы можем сделать с издеваться. Вот пример кода.

private MockMvc mockMvc; 

     @Autowired 
     private FilterChainProxy springSecurityFilterChain; 

     @Autowired 
     private WebApplicationContext wac; 

     protected MockHttpSession session; 

     protected MockHttpServletRequest request; 

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

     @Test 
     void test(){ 
     // I log in and then returns session 
     HttpSession session = mockMvc.perform(post("/j_spring_security_check").param("NAME", user).param("PASSWORD", pass)) 
        .andDo(print()).andExpect(status().isMovedTemporarily()).andReturn().getRequest().getSession(); 
     } 

Также мы можем сделать с этим образом, вы можете просто вызвать метод startSession(), и будет возвращен «текущая» сессия.

protected void startSession() { 
     session = new MockHttpSession(); 
    } 

    protected void endSession() { 
     session.clearAttributes(); 
     session = null; 
    } 

    // we can create request too, just simple way 
    protected void startRequest() { 
     request = new MockHttpServletRequest(); 
     request.setSession(session); 
     RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); 
    } 
2

Вы можете использовать MockHttpSession: http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/mock/web/MockHttpSession.html

Больше информации здесь: Spring mvc 3.1 integration tests with session support

+0

Я не издеваюсь. Потому что тогда я вызываю this.mockMvc.perform (мой контроллер), mock не вызывает мой сервисный уровень. это мой proble, m – grep

+0

Я имею в виду эту проблему, когда я использую mock, поэтому я не хочу издеваться: http://stackoverflow.com/questions/26508628/how-to-call-springs-service-method-from-controller -junit – grep

+0

Если вы сохраняете идентификатор пользователя в качестве атрибута сеанса, вы также можете установить его на 'MockHttpSession'. Затем, когда ваш код использует этот объект, он вернет любое значение, которое вы хотите. – Foxsly

0

Один из вариантов будет вводить идентификатор пользователя (не HttpSession) в компонент службы, используя выражение SPEL. Чтобы добиться правильного поведения во время выполнения, вы должны убедиться, что ваш сервисный компонент является прокси-сервером с поддержкой AOP.

Дополнительную информацию см. В разделе справочного руководства по пружине "Testing request and session scoped beans".

С уважением,

Сэм (spring-test компонент свинца)

0

Я написал следующую функцию для создания «реальных» сеансов при использовании хранилища сеансов mongo.

private Session generateMongoHttpSession(final Role role, final Permission... permissions) { 
    final Set<GrantedAuthority> authorities = 
    role.getPermissions() 
     .stream() 
     .map(p -> new SimpleGrantedAuthority(p.toString())) 
     .collect(Collectors.toSet()); 

    Arrays.stream(permissions) 
    .forEach(p -> authorities.add(new SimpleGrantedAuthority(p.toString()))); 

    final UserDetails userDetails = 
    new org.springframework.security.core.userdetails.User(
     "test-user-name", "test-password", true, true, true, true, authorities); 

    final Authentication authentication = 
    new UsernamePasswordAuthenticationToken(
     userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 

    final UsernamePasswordAuthenticationToken authenticationToken = 
    new UsernamePasswordAuthenticationToken(
      userDetails, authentication.getCredentials(), userDetails.getAuthorities()); 
    authenticationToken.setDetails(authentication.getDetails()); 

    final SecurityContextImpl context = new SecurityContextImpl(); 
    context.setAuthentication(authentication); 

    final MongoExpiringSession session = mongoOperationsSessionRepository.createSession(); 
    session.setAttribute("SPRING_SECURITY_CONTEXT", context); 
    session.setAttribute("sessionId", session.getId()); 
    mongoOperationsSessionRepository.save(session); 

    return session; 
}