인프런 커뮤니티 질문&답변

박준일님의 프로필 이미지
박준일

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 전파 활용6 - 복구 REQUIRED

테스트 recoverException_fail메서드 UnexpectedRollbackException

해결된 질문

작성

·

464

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

안녕하세요.

테스트케이스 recoverException_fail 를 실행했을때 테스트가 실패하여 질문 남깁니다.

 

해당 테스트 케이스를 실행하면 실패 로그가 나오고

java.lang.Exception: exception just for purpose of providing stack trace

at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:310) ~[hibernate-core-6.3.1.Final.jar:6.3.1.Final]

 

java.lang.AssertionError:

Expecting actual throwable to be an instance of:

org.springframework.transaction.UnexpectedRollbackException

but was:

java.lang.RuntimeException

at hello.springtx.propagation.LogRepository.save(LogRepository.java:26)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)

...(108 remaining lines not displayed - this can be changed with Assertions.setMaxStackTraceElementsDisplayed)

at hello.springtx.propagation.MemberServiceTest.recoverException_fail(MemberServiceTest.java:135)

at java.base/java.lang.reflect.Method.invoke(Method.java:568)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

 

UnexpectedRollbackException 을 기대하지만 RuntimeException가 나온다고 메세지가 나오는데

 

설명 해주신 대로면 UnexpectedRollbackException 예외가 나오는게 맞는거 아닌가요..?

 

 

 

 

 

 

답변 2

0

박준일님의 프로필 이미지
박준일
질문자

https://drive.google.com/file/d/1YbrL5TD5CJFG31ZaYIk3Dh1kOqV2LB5x/view?usp=sharing

 

감사합니다.

 

MemberServiceTest.java 에서

recoverException_fail() 테스트케이스랑

/**
 * MemberService @Transactional:ON
 * MemberRepository @Transactional:ON
 * LogRepository @Transactional:ON Exception
 */
//테스트케이스 실패..?
@Test
void recoverException_fail() {
    //given
    String username = "로그예외_recoverException_fail";
    //when
    //try - catch 걸려있는 joinV2
    assertThatThrownBy(() -> memberService.joinV2(username))
            .isInstanceOf(UnexpectedRollbackException.class);
    //then: 모든 데이터가 롤백된다.
    assertTrue(memberRepository.find(username).isEmpty());
    assertTrue(logRepository.find(username).isEmpty());
}

 

recoverException_success() 테스트케이스가 실패됩니다..!

/**
 * MemberService @Transactional:ON
 * MemberRepository @Transactional:ON
 * LogRepository @Transactional(REQUIRES_NEW) Exception
 */
//테스트케이스 실패..?
@Test
void recoverException_success() {
    //given
    String username = "로그예외_recoverException_success";
    //when
    memberService.joinV2(username);
    //then: member 저장, log 롤백
    assertTrue(memberRepository.find(username).isPresent());
    assertTrue(logRepository.find(username).isEmpty());
}

 

보내주신 코드 살펴보았습니다!
imagelogRepository.save()가 강의에서와는 달리 try-catch 문 밖에 하나 더 존재합니다!

해당 부분을 삭제하신 후 전파옵션을 강의와 같이 각 테스트마다 바꿔서 테스트해보시면 정상적으로 진행하실 수 있습니다!

imageimage

박준일님의 프로필 이미지
박준일
질문자

답변 너무 감사합니다...!

0

안녕하세요. 박준일님, 공식 서포터즈 y2gcoder입니다.

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

박준일님의 프로필 이미지
박준일

작성한 질문수

질문하기