[Spring] @Transactional 서비스 rollback 테스트 하는 방법

2023-05-29


사진: Unsplash 의 Pawel Czerwinski


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 ");
    }
    
 ...

 


메인 이미지 출처 : 사진: UnsplashPawel Czerwinski