코드로 보는 것이 확실하게 이해가 될 것이다.
예제: 회원가입시 중복 회원은 가입할 수 없다.
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)
'Spring&Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring MultipartFile 파일업로드 구현하기 (0) | 2022.07.07 |
---|---|
[Spring Boot] 스프링 시큐리티 - 패스워드 암호화 적용하기 (0) | 2022.06.29 |
JSP와 Thymeleaf (차이점, 동작 원리) (0) | 2022.04.01 |
스프링 컨테이너(BeanFactory, ApplicationContext) (0) | 2022.03.19 |
댓글