@Transactional은 auto_increment를 초기화 하지 못한다
프로젝트의 테스트를 작성하던 도중 Unique 한 PK값이 존재하지 않아 auto_increment 되는 값을 통해 조회해야 하는 일이 발생하였습니다.
저는 @BeforeEach 어노테이션이 매번 호출되도록 설정하여 repository를 새로 초기화했으며 @Transcational 어노테이션이 @DataJpaTest 안에 들어있어 1개의 데이터를 넣어주면 1L을 조회하면 될 것이라고 생각하였습니다.
@BeforeEach
void setUp() {
boardService = new BoardServiceImpl(boardRepository);
}
하지만 @Transactional 어노테이션은 테이블에 대한 롤백은 시켜주나, auto-increment에 대한 롤백은 되지 않았습니다.
즉, auto-increment에서 독립적으로 테스트하길 원한다면 이에 대한 세팅을 추가적으로 해주어야 합니다.
이런 이슈때문에 각 테스트는 독립적으로 수행되지 않으며 다른 테스트에 영향이 받는 상황이 놓인 것입니다.
해결방법 1
@SQL 어노테이션 활용
ALTER TABLE station AUTO_INCREMENT = 1;
테이블의 auto-increment 값을 1로 세팅해줍니다.
해결방법 2
Repository Layer를 Mocking 해서 테스트 진행
해결방법 3
1L 같은 매직넘버를 사용하지 않고 직접 id값을 받아와서 수행
출처
https://unluckyjung.github.io/testcode/2021/05/08/Independent-Test-Mehod/
테스트 메소드별로 독립된 환경에서 테스트하기
스프링 테스트 코드를 작성할때 테스트 순서에 영향받지 않고, 독립적으로 테스트 해봅니다. Spring 5, H2 DB 환경
unluckyjung.github.io