assertThrows 메소드는 발생이 예상되는 예외의 타입, 예외가 발생될 수 있는 코드 블록을 파라미터로 받아서 실행된다.
이 때, assertThrows 내부에서는 예외가 발생될 수 있는 코드 블록을 실행한다.
만약 해당 코드 블록을 실행하는 중에 예외가 발생한다면 발생된 예외가 발생이 예상되는 예외의 타입과 일치하는지 아닌지를 확인한다.
발생된 예외 타입과 예상되는 예외 타입이 일치하면 테스트는 성공이다.
< assertThrows 메소드 내부 동작 >
위 사진을 보면,
try 블록 안에서 코드를 실행하여 예외 발생시 catch 내에서 발생한 예외 타입과 예상되는 예외 타입을 비교하고 있는 것을 볼 수 있다.
스프링 컨테이너에서 xxxxx라는 이름을 가진 빈을 조회하였는데, 이러한 빈은 없다!
따라서 NoSuchBeanDefinitionException 예외가 발생하였다.
org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxxx", MemberService.class));
위처럼 junit의 Assertions를 사용해야 한다. 너무 길기 때문에.. static import를 하면(Alt + Enter)
import static org.junit.jupiter.api.Assertions.*;
이렇게 static import 된다!
존재하지 않는 빈의 이름으로 빈을 가져오려고 할 때 예외가 발생되는 상황을 테스트 하기 위한 메소드이다.
파라미터(발생이 예상되는 예외의 타입, 예외가 발생될 수 있는 코드 블록)
인 것이다!
즉, assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxxx", MemberService.class));
이렇게 쓸 수 있다.
() -> ac.getBean("xxxxx", MemberService.class)
를 실행 후 예외가 발생한다면 NoSuchBeanDefinitionException.class
의 예외 타입과 일치하는지 확인하여 맞다면 테스트 성공이다~!