트랜잭셔널 어노테이션을 사용하면 영속성 컨텍스트가 사용되고, 이 안에서 엔티티의 칼럼이 변경되면 변경 감지(Dirty Checking)이 발생해서 트랜잭션의 commit 시점에 변경 사항이 반영된다.
그런데, 테스트코드에서는 안되는거야. 왤까?
public void softDeleteMovie(){
this.inUse = false;
}
@Test
void softDeleteDefaultTest(){
Movie movie = movieRepository.findById(1L).orElseThrow(
() -> new NoSuchElementException("해당하는 영화가 없습니다")
);
movie.softDeleteMovie();
}
실제 쿼리
@Test
@Transactional
void softDeleteDefaultTest(){
Movie movie = movieRepository.findById(1L).orElseThrow(
() -> new NoSuchElementException("해당하는 영화가 없습니다")
);
movie.softDeleteMovie();
}
@Test
void softDeleteDefaultTest(){
Movie movie = movieRepository.findById(1L).orElseThrow(
() -> new NoSuchElementException("해당하는 영화가 없습니다")
);
movie.softDeleteMovie();
movieRepository.save(movie); // 명시적 저장
}
테스트코드에서 작성되는 모든 코드들은 Transaction 영향을 받는다.
@Test
void softDeleteMovie() {
//given
Movie movie = movieRepository.findById(1L).orElseThrow(
() -> new NoSuchElementException("해당하는 영화가 없습니다")
);
//when
movie.softDeleteMovie();
movieRepository.save(movie);
//then
List<MovieResponseDto> movies = movieRepository.getMovies(1L);
assertEquals(2, movies.get(0).getId());
}
when에서 명시적으로 업데이트를 발생시키고,
그 후 getMovies의 첫번째 요소가 inUse=false로 제거된 1L번 id를 가진 요소가 아닌
2번 id를 가진 요소임을 확인