티스토리 뷰

스프링 버젼이 높아지며 변화한 것 중 하나는 JUnit 기반의 테스트입니다.

4.X에서 JUnit의 테스트 러너를 확장하는 방법 중 하나로 @RunWith(SpringRunner.class) 에노테이션을 사용하였습니다. 스프링 부트를 사용하여 테스트를 진행하는 경우 항상 이 에노테이션을 붙여서 사용했습니다. 아래의 MemberServiceTest 코드를 보시면 알 수 있습니다.

// JUnit 4 버젼의 테스트 코드

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

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;
    
    @Test
    public void join() throws Exception {
            Member member = new Member();
            member.setName("kim");
    		
            Long saveId = memberService.join(member);
    		
            assertEquals(member, memberRepository.findOne(saveId));
        }
}

또한 테스트를 진행하며 실패하는 것이 정상 로직인 경우에는 JUnit4에서는 다음과 같이 처리하였습니다.

@Test 에노테이션을 사용해 사용자가 구현해 놓은 예외 클래스나 자바에서 제공하는 기본 예외 클래스를 설정하였습니다. @Test(expected = Exception.class)와 같이 사용하였습니다.

@Test(expected = IllegalStateException.class) 
public void 중복_회원_예외() throws Exception {
        Member member1 = new Member();
        member1.setName("kim");
        
        Member member2 = new Member();
        member2.setName("kim");
	
    	memberService.join(member1); memberService.join(member2); //예외 발생
	
 	fail("예외가 발생해야 한다."); // 이 시점까지 도달하면 테스트 실패
}

JUnit5 에서는 ?

@RunWith

JUnit 5 부터는 @RunWith가 아닌 @SpringBootTest 하나만으로 사용할 수 있습니다. 정확하게 말하면 @RunWith가 아닌 @ExtendWith 에노테이션을 사용하였습니다. @ExtendWith(MyExtension.class) 처럼 Extension 구현체를 지정해 줄 수 있습니다. 앞 서 말씀드린 것 처럼 @SpringBootTest 하나만으로 사용할 수 있는데 스프링에서 제공하는 스프링부트테스트 인터페이스를 들어가보면 @ExtendWith(SpringExtension.class)를 기본적으로 제공하고 있음을 알 수 있습니다 ! 

 

정리하자면, JUnit 5 부터는 @RunWith를 사용할 필요가 없고 @ExtendWith를 사용해야 하지만 @SpringBootTest를 사용하면 모두 해결할 수 있습니다. 

 

 

@Test(expected = Exception.class)

JUnit 5부터 테스트를 진행할 때 예외가 발생하는 것이 올바른 로직인 경우에는 @Test(expected = Exception.class)를 사용하지 않습니다. 결론부터 말하면 AssertThrows를 사용하여 예외를 체크합니다.

 

1. 기본적인 자바 문법인 try - catch 를 사용하여 예외가 발생한 경우 return 을 시켜 테스트를 통과. 

2. assertThrows를 사용하여 예상되는 예외 클래스를 설정한 후, 람다식을 이용해 원하는 로직 실행

 

기본 자바 문법을 사용하는 1번 방법 보다는 테스트에 보다 더 적합한 2번 방법을 사용하는 것이 좋을 것 같습니다.

정리하자면, JUnit 5 부터는 assertThrows(Exception.class, () -> 원하는 로직))을 사용하여 예외 발생 테스트를 진행할 수 있습니다 !

    // Try - Catch 이용
    @Test
    public void 중복_회원_예외() throws Exception{
       
        Member member1 = new Member();
        member1.setName("kim");

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

        
        memberService.join(member1);
        try {
            memberService.join(member2); // 예외가 발생해야 한다
        } catch (IllegalArgumentException e){
            return;
        }

        
        fail("예외 발생.");
    }
    
    
    
    // assertThrows 이용
    @Test
    public void 중복_회원_예외() throws Exception{
       
        Member member1 = new Member();
        member1.setName("kim");

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

        
        memberService.join(member1);
        assertThrows(IllegalArgumentException e.class, () -> memberService.join(member2));
        
        fail("예외 발생.");
    }
댓글