본문 바로가기
Spring&Spring Boot

Junit5 에서 Exception 테스트 (Junit4 @Test(expected = exception)

by 피자보다 치킨 2022. 5. 31.

코드로 보는 것이 확실하게 이해가 될 것이다.

 

예제: 회원가입시 중복 회원은 가입할 수 없다.

 

 service

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;
    
    @Transactional
    public Long join(Member member) {

        //EXCEPTION
        List<Member> findMembers = memberRepository.findByName(member.getName()); //회원이름으로 조회

        if (findMembers.size() > 0) {
            throw new IllegalStateException("이미 존재하는 회원입니다");
        }
        memberRepository.save(member); //회원 저장
        return member.getId();
    }

}

 

1. Junit4 경우 테스트코드

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {

    @Autowired MemberService memberService;

    @Test(expected = IllegalStateException.class)
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("kim1");

        Member member2 = new Member();
        member2.setName("kim1");

        //when
        memberService.join(member1);
        memberService.join(member2);// 예외가 발생

        //then
        fail("예외가 발생해야한다"); //(예외가 발생하지 않으면 발생)
    }
}

Junit4에서는 위처럼 @Test expected로 해당 예외를 담아주면 자동으로 예외 테스트가 된다.

하지만 이 방법은 Junit4에서만 가능하다.

 

2. Juint5 경우 테스트코드

@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
class MemberServiceTest {

    @Autowired
    MemberService memberService;

    @Test
    void 중복_회원_예외() throws Exception {
        //given
        Member member1 = new Member();
        member1.setName("kim");

        Member member2 = new Member();
        member2.setName("kim");

        //when
        memberService.join(member1);
        try {
            memberService.join(member2);
        } catch (IllegalStateException e) {
            return;
        }

        //then
        fail("예외가 발생해야 합니다. (예외 발생 안함)"); //이 경우 테스트 실패
        assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    }

}

Junit5에서는 @Test에서 expecred 속성이 제거되어 사용이 불가능하다.

대신 assertThrows에 필요한 클래스를 등록하여 람다식으로 예외를 던질 실행문을 작성한다.

 

assertThrows 메소드

static <T extends Throwable>T assertThrows(Class<T> expectedType, Executable executable)

static <T extends Throwable>T assertThrows(Class<T> expectedType, Executable executable, String message)

static <T extends Throwable>T assertThrows(Class<T> expectedType, Executable executable, Supplier<String> messageSupplier)

 

댓글