You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
현재 TotalScheduleRecommenderTest 수행 시 @Transactional 어노테이션이 없으면 LazyInitializationException 이 발생합니다. findAllByAttendeeIn() 메서드에서 Schedule을 조회할 때 프록시 객체로 가져오는데, 테스트 코드의 단언문이 트랜잭션 밖에 있으므로 attendee를 조회할 수 없기 때문입니다.
또한, @BeforeEach 로 정의된 setUp() 에서 테스트 데이터를 삽입하고 있는데, @Transactional 추가 시 데이터 삽입 로직과 테스트 로직이 동일한 트랜잭션으로 묶이게 됩니다. 이때 동일 트랜잭션이므로 JPA 캐시에서 가져온 ‘정확히 동일한’ 객체를 단순 비교하고 있어서 현재의 테스트가 통과하는데, 현재와 같은 테스트는 DB를 거치지 않으므로 신뢰할 수 없습니다.
실제로 데이터 삽입 이후 명시적으로 영속성 컨텍스트를 em.clear() 하게 되면 캐시 미스가 발생하고, 실제 DB조회가 일어날 때 값이 같은 새로운 객체가 만들어지므로 테스트에 실패하게 됩니다.
상세 작업 내용
테스트 코드에서 @Transactional 어노테이션 제거 (가능할 경우)
테스트 데이터의 동등성 비교 로직 수정 (메모리 주소가 아닌 값을 기준으로 검사)
레퍼런스
The text was updated successfully, but these errors were encountered:
이슈 요약
현재
TotalScheduleRecommenderTest
수행 시@Transactional
어노테이션이 없으면LazyInitializationException
이 발생합니다.findAllByAttendeeIn()
메서드에서Schedule
을 조회할 때 프록시 객체로 가져오는데, 테스트 코드의 단언문이 트랜잭션 밖에 있으므로attendee
를 조회할 수 없기 때문입니다.또한,
@BeforeEach
로 정의된setUp()
에서 테스트 데이터를 삽입하고 있는데,@Transactional
추가 시 데이터 삽입 로직과 테스트 로직이 동일한 트랜잭션으로 묶이게 됩니다. 이때 동일 트랜잭션이므로 JPA 캐시에서 가져온 ‘정확히 동일한’ 객체를 단순 비교하고 있어서 현재의 테스트가 통과하는데, 현재와 같은 테스트는 DB를 거치지 않으므로 신뢰할 수 없습니다.실제로 데이터 삽입 이후 명시적으로 영속성 컨텍스트를
em.clear()
하게 되면 캐시 미스가 발생하고, 실제 DB조회가 일어날 때 값이 같은 새로운 객체가 만들어지므로 테스트에 실패하게 됩니다.상세 작업 내용
@Transactional
어노테이션 제거 (가능할 경우)레퍼런스
The text was updated successfully, but these errors were encountered: