2023-05-29
1. 방법
우선적으로 롤백 테스트를 진행하기 위해서는 롤백이 될 수 있도록 임의로 예외가 발생하는 상황을 만들어 주어야 한다. 아래의 //Transactional이 적용된 주석이 실제 로직상에 강제로 예외가 발생할 수 있도록 만든 부분이다. (해당 부분은 각자의 서비스 로직에 따라 달라질 수 있으니 커스텀이 필요하다.)
utilInfoSimpleService.addUtilView(request,
UtilViewRequestDto.builder()
.utilNo(999999)
.build());
이후 해당 로직에서 발생하는 예외(RuntimeException.class)를 assertThrows 가 캐치하게 되며, 실제 에러가 RuntimeException.class 가 맞을 경우 테스트 케이스는 성공하며, 정상적으로 트랜잭션은 롤백이 된다. (명시된 에러가 아닐 경우 테스트 케이스가 실패할 수 있으니 주의하자.) 이후 검증을 위해 실제 삽입된 데이터가 존재하는지 여부를 확인하는 코드가 아래의 코드이며, 이 역시 본인의 서비스 로직에 따라 변경될 수 있다.
UtilViewsDto utilViewsDto = utilViewRepository.findByUtilNoAndViewIpAndViewDate(999999, "111.11.11.111", DateUtil.getDateStryyyyMMdd());
System.out.println("utilViewsDto is ->>>>>>" + utilViewsDto);
MatcherAssert.assertThat("utilInfoDto is not null Transactional not working", utilViewsDto, is((nullValue())));
아래는 전체 코드이다. 참고하여 본인의 테스트 케이스를 작성하면 된다.
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThrows;
...
@Test
public void addUtilView(){
//HTTPRequest Mock 객체
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRemoteAddr("111.11.11.111");
System.out.println("======= addUtilView 롤백 테스트 [시작] =======\n ");
//롤백이 발생할 수 있는 예외상항을 아래에 명시한다.
assertThrows(RuntimeException.class, ()->{
//Transactionl이 적용된
utilInfoSimpleService.addUtilView(request,
UtilViewRequestDto.builder()
.utilNo(999999)
.build());
});
//롤백발생 후 해당 데이터가 정상적으로 롤백 되었는지 확인한다.
UtilViewsDto utilViewsDto = utilViewRepository.findByUtilNoAndViewIpAndViewDate(999999, "111.11.11.111", DateUtil.getDateStryyyyMMdd());
System.out.println("utilViewsDto is ->>>>>>" + utilViewsDto);
MatcherAssert.assertThat("utilInfoDto is not null Transactional not working", utilViewsDto, is((nullValue())));
System.out.println("======= addUtilView 롤백 테스트 [종료] =======\n ");
}
...
메인 이미지 출처 : 사진: Unsplash의Pawel Czerwinski