반응형
오류상황
Spring Boot 테스트 코드를 작성한 뒤, 전체 테스트 코드를 통합 테스트 할 때 아래와 같은 오류 메시지가 발생하였다.
TokenRepositoryTest
해당 class를 단독으로 test할 때는 오류가 발생하지 않았으나, 전체 클래스를 통합 테스트 할 시에는 위 사진과 같은 오류가 발생함.
내가 생각한 오류 원인
TokenRepositoryTest class 이전에 AuthServiceTest.class 에서 이미 refresh_token table을 생성하고 데이터를 넣은 뒤 Rollback시킨다(@Transactional). 하지만 table에 적용된 Auto Increment 값은 이미 1에서 2로 증가한 상태라, TokenRepositoryTest에서 row 2개를 insert하였을 때, 값이 1, 2가 아닌 2, 3이 출력된다고 생각한다.
해결 방법
1. 아래 어노테이션을 추가한다.
- 아래 어노테이션을 추가하니 통합 테스트는 성공하였으나, 해당 어노테이션에 대한 정확한 이해를 아직 하지 못하였으므로, 사용하지 않기로 함.
@TestPropertySource(properties = "spring.test.context.listener.include=org.springframework.test.context.event.ApplicationEventsTestExecutionListener")
2. Id 값 대신 token 등 다른 column의 값을 테스트한다.
3. 아래 stackoverflow 링크를 참고. Repository interface 안에 table을 truncate하는 메소드를 추가한다.
TokenRepository
public interface TokenRepository extends JpaRepository<RefreshToken, Long> {
// ...
@Modifying
@Query(
value = "truncate table refresh_token",
nativeQuery = true
)
void truncateRefreshTokenTable();
}
TokenRepositoryTest
@BeforeEach
void init() {
tokenRepository.truncateRefreshTokenTable();
}
4. @SpringBootTest 대신, @DataJpaTest를 사용한다.
@Transactional
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
@TestPropertySource(locations = "classpath:application.yml")
class TokenRepositoryTest {
// ...
}
참고 링크
1. 테스트 메소드별로 독립된 환경에서 테스트하기. https://unluckyjung.github.io/testcode/2021/05/08/Independent-Test-Mehod/
2. ChatGPT에게 질문
3. stackoverflow Is it possible to use "TRUNCATE" in Spring Data JPA using JpaRepository? Or a more effective method than the standard deleteAll()?
4.
반응형
'Spring Boot > Test Code' 카테고리의 다른 글
Junit5] WebMvcTest: java.lang.AssertionError: JSON path (0) | 2023.07.15 |
---|---|
Junit5] 테스트 코드 작성을 위한 서비스 코드 리팩토링 (0) | 2023.07.14 |
Junit5] NullPointerException with @Value (0) | 2023.07.02 |
Junit5] WebMvcTest: MockHttpServletResponse: Status = 401 Error message = Unauthorized (0) | 2023.07.01 |
Junit5] WebMvcTest (0) | 2023.06.09 |