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