안녕하세요.
단위테스트에서 또 오류가 발생해서 해결방법을 공유해보고자 합니다.
이번 오류는 정말 중요한 개념이 있는 오류였습니다.. 이 개념을 혼자 공부할 때 알게된 걸 천만다행으로 생각합니다.
에러 원인은 Foreign Key로 다른 테이블로부터 참조를 당하고 있는 계정 테이블의 데이터를 삭제하려고 하니 발생하는 문제였습니다.
사용 중인 기술 스택
- 스프링부트
- JUnit5
- 인메모리 디비(h2)
- Spring data JPA
에러가 발생하는 단위테스트 클래스에서는 멤버 메서드가 실행될 때마다, 매번 계정을 새로 인메모리 디비에 저장하고 로그인이 된 상태로 맴보 메서드가 수행이 되고, 메서드 동작이 종료되면 @AfterEach 메서드로 계정정보를 날리도록 만들어져 있습니다.
여기서 문제가 발생하는 부분은 메서드가 끝날 때 생성된 계정을 삭제하기 위해서 @AfterEach 어노테이션을 사용해서 repository.deleteAll()을 사용하는데, 이 부분에서 에러가 터지고 있던 것이었습니다.
에러 메시지
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a];
constraint ["FKS0IO7N0IX59JNMBYPUOT4NI14: PUBLIC.STUDY_MANAGERS FOREIGN KEY(MANAGERS_ID) REFERENCES PUBLIC.ACCOUNT(ID) (86)";
SQL statement: delete from account where id=? [23503-200]];
nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
위의 에러메시지의 굵은 표시를 보면, 실행쿼리는 SQL statement: delete from account where id=? 에서 발생하는 에러였습니다. STUDY_MANAGERS라는 조인으로 만들어진 테이블에서 MANAGERS_ID라는 컬럼이 ACCOUNT의 ID칼럼을 참조하고 있는데 에러가 발생한다는 것을 말해주고 있습니다.
에러 원인
STUDY_MANAGERS라는 조인으로 만들어진 테이블에서 MANAGERS_ID라는 컬럼이 ACCOUNT의 ID칼럼을 참조하고 있는데,
ACCOUNT 테이블의 데이터를 삭제하려고 하니 발생하는 문제였습니다.
해결방법
Foreign Key로 다른 테이블로부터 참조를 당하고 있는 계정 테이블의 데이터를 삭제하려고 하니 발생하는 문제였기 때문에, 단순히 참조를 하는 테이블부터 먼저 데이터를 deleteAll()해주고, 계정 테이블을 deleteAll()하면 간단히 해결되는 문제였습니다.
감사합니다.
'SpringBoot > 테스트코드' 카테고리의 다른 글
JUnit5에서 의존성 주입은 @Autowired로 해야하는 이유 (7) | 2020.09.10 |
---|---|
단위테스트에서 여러 properties 중 한 개만 지정하기 (0) | 2020.08.22 |
[Springboot 단위테스트]MockMvc Bean을 주입받지 못하는 에러 (0) | 2020.07.26 |
JUnit4와 JUnit5의 차이점. (0) | 2020.07.19 |
[SecurityTest]로그인 인증 테스트 방법 (0) | 2020.07.19 |
댓글