如何在Spring Junit中创建会话

时间:2014-11-24 10:41:42

标签: java spring unit-testing junit spring-test

我有这样的图层:

弹簧控制器 - >服务层 - >道层(JPA)。

我想编写服务和控制器的测试用例。在另一个Junit将调用控制器,控制器将调用服务,服务层获取数据库信息等。

在这种情况下我不想进行模拟,我只想编写junit测试用例(我必须调用服务,服务必须从数据库中获取实际数据)。

我只有一个问题,服务层获取会话中的用户ID。我得到了自动连接注释的会话。如何在测试用例期间创建假会话?

p.s我认为模拟不适合我......因为我不会模仿我的服务,我想用真实的数据库数据创建真正的控制器调用...

4 个答案:

答案 0 :(得分:4)

我们可以做模拟。这是代码示例。

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()方法,并且会有" current"会话返回。

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));
    }

答案 1 :(得分:2)

答案 2 :(得分:0)

一种选择是使用SpEL表达式将用户ID(而不是HttpSession)注入服务组件。要实现正确的运行时行为,必须确保您的服务组件是AOP范围的代理。

有关详细信息,请查看Spring参考手册的"Testing request and session scoped beans"部分。

此致

Sam spring-test组件负责人)

答案 3 :(得分: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;
}