Error/Spring Boot

[Spring Boot] @Test(expected ~) 에러 (Junit4, Junit5)

prao 2023. 7. 13. 15:59
반응형

에러 내용

1) 발생

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import org.junit.jupiter.api.Test;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;

import static org.junit.Assert.*;

@SpringBootTest
@Transactional
public class MemberServiceTest {

    @Autowired
    MemberService memberService;
    @Autowired
    MemberRepository memberRepository;
    @Autowired
    EntityManager em;

    @Test
    @Rollback(false)
    public void 회원가입() throws Exception {
        //given
        Member member = new Member();
        member.setName("kim");

        //when
        Long savedId = memberService.join(member);

        //then
        em.flush();
        assertEquals(member, memberRepository.findOne(savedId));
    }

    @Test(expected = IllegalStateException.class)
    public void 중복_회원_가입() throws Exception {
        //given
        Member member1 = new Member();
        member1.setName("kim");

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

        //when
        memberService.join(member1);
        memberService.join(member2); //예외가 발생해야 한다!!

        //then
        fail("예외가 발생해야 한다.");
    }
}

에러 내용

Junit4를 기준으로 하는 강의에서 try-catch문의 역할을 대신하는 @Test(expected = IllegalStateException.class) 코드를 사용하여서 따라 작성하였더니, Junit5 환경에서는 에러 발생.


2) 원인

Junit4와 Junit5의 차이점이 문제. 변경사항이 존재한다. @Test(expected = IllegalStateException.class) 대신 assertThrows(IllegalStateException.class, () -> memberService.join(member2));와 같은 방식으로 처리한다.


3) 해결

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;

...

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

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

// when
    memberService.join(member1);
    assertThrows(IllegalStateException.class, () -> memberService.join(member2));

// then
}

Junit5에서는 @Test 어노테이션을 사용할 때 expected 속성을 사용하지 않습니다. 대신 assertThrows() 메소드를 사용하여 특정 예외가 발생하는지 테스트할 수 있다. 위의 예시 코드에서는 assertThrows() 메소드를 사용하여 IllegalStateException이 발생하는지 검증한다.

Junit5를 사용하면 조금 더 직관적이고 편리한 테스트 코드를 작성할 수 있다.

반응형