해결된 질문
작성
·
579
2
안녕하세요.
단위테스트 할 때는 문제가 없으나 전체 테스트 할 때
PostControllerTest의 "글 여러개 조회" 테스트 와, "페이지를 0으로 요청하면 첫 페이지를 가져온다." 테스트 에서 에러가 납니다.
Spring Rest Docs 생성에도 지장이 있어, 현재는 임시방편으로
//.andExpect(jsonPath("$[0].id").value(30))
둘 다 이 id 체크를 주석처리해놓고 진행하고 있습니다.
구글링해서 찾아보니
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
이 방식으로 컨텍스트를 매번 재생성 하는 방법도 있다곤 하지만 이렇게 해도 에러가 나고, 성능이 안좋아진다고 합니다. 이런 문제는 보통 어떤식으로 해결하는지 궁금합니다!
추가로 호돌맨님은 강의에서 따로 이 부분이 걸리진 않던데 이유도 궁금하네요,,,
답변 1
1
안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.
JPA id 값은 JPA전략과 DB 전략이 맞물려 알아서 생성될 겁니다. 저희가 크게 신경쓸 부분이 아닙니다. 1이 들어가던 10이 들어가던 고양이가 들어가던 그건 시스템에서 알아서 할 일 입니다.
mysql에서는 기본적으로 auto_increment를 통해 id값이 1부터 순차적으로 증가하여 insert됩니다. 그렇기 때문에 한 개의 테스트는 성공이 될 수 있지만 여러개를 테스트 한다면 이 전에 종료된 테스트의 id + 1로 입력되기 때문에 테스트가 실패 할 수 있습니다.
테스트가 모두 종료되면 테스트 환경에 맞는 database, h2나 mysql db등의 테이블이 리셋(drop)됩니다. 그리고 테스트를 실행하면 테이블이 생성되는 동시에 모든 테이블들의 id값이 1로 초기화 됩니다.
꼭 필요하다면 given에서 주어진 entity의 id값으로 insert가 잘 되었는지 확인합니다. post.getId()가 내부적으로 어떤 기능을 하는지 모르는 상태로 값 비교를 하기 때문에 완벽하지 않습니다. 예를들어 db에 post.id값이 1로 들어가고, post.getId() 메서드가 무조건 1을 return하여 테스트가 통과 될 수도 있습니다. 그래서 이는 최소한으로 버그가 없는지 확인하는 정도로만 넣어둡니다.
감사합니다.
명쾌하게 해결됐습니다. 감사합니다!