spring boot

springbootTest에서 session 이용하기

원코드 2023. 4. 19. 13:09

세션값을 가져오는 코드가 매번 반복되기 때문에 이를 어노테이션 기반으로 개선했는데, 이로인해 테스트시 NullPointException 에러가 발생했다. 

 @ResponseBody
    @PostMapping("/goals")
    public Long save(@RequestBody GoalsSaveRequestDto requestDto, @LoginUser SessionUser user //메소드 인자로 세션값 바로 받기) {
        return goalsService.save(requestDto, user.getId());
    }

@LoginUser 라는 어노테이션을 생성해서 session의 user값을 가져와 SessionUser 클래스에 담아 전달하는 형태인데, 테스트에선 세션값이 없으니 계속 오류가 발생했다.(자세한 내용)

 

MockHttpSession

MockMvc 테스트에서 Session값을 생성하고 사용할 수 있게 해줍니다.

 

    private MockMvc mvc;

    protected MockHttpSession session;
    
    @Before
    public void mock_setup() { //MockMvc 인스턴스 생성
        session = new MockHttpSession(); //1. 세션 생성
        User user = userRepository.save(User.builder()
                .picture("picture")
                .role(Role.USER)
                .name("name")
                .email("email")
                .build());
        sessionUser = new SessionUser(user);
        session.setAttribute("user", sessionUser); //2. 세션 값 설정

        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .build();
    }
    
    @After
    public void deleteAll() {
        //3. 세션 삭제
        session.clearAttributes();
        System.out.println("테스트 데이터 삭제 완료");
    }
    
    @Test
    @Transactional
    public void save_Test() throws Exception {
       /*생략*/
       
        //when
        mvc.perform(post(url)
                .session(session) //4. 세션 전달
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(objectMapper.writeValueAsString(goals)))
                .andExpect(status().isOk());
        
    }

1.  'new MockHttpSession()' 을 통해서 세션을 생성해주고 (@Before에서 안하고 @Test에서 생성해도 됨)

2. 'sessionAttribute()' 로 전달하고자 하는 값 저장

3. 'clearAttribute()' 로 테스트 후 세션 삭제

4. mockMvc의 session() 함수를 통해 세션 전달

 

결과

성공!

 

참고한 블로그:

https://shinsunyoung.tistory.com/70

 

SpringBoot의 MockHttpSession을 이용해서 JUnit Mock 테스트하기

안녕하세요! 이번 포스팅에서는 SpringBoot의 MockHttpSession를 이용해서 JUnit에서 Mock객체를 이용한 Test를 통과하는 방법에 대해 알아보겠습니다. 🤗 🤔 문제 상황 검증해야 할 메소드에 getAttribute()

shinsunyoung.tistory.com