예외처리를 테스트 할때 try-catch문 대신에 assertThrow를 사용할 수 있다.
@Test
public void 중복회원예외() {
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
try {
memberService.join(member2);
fail();
} catch (IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
}
//then
}
@Test
public void 중복회원예외() {
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
//then
}
여러 개의 테스트 코드 클래스를 생성하면서 여러개의 새로운 레포지토리 객체가 생성되며 레포지토리 객체의 내용이 서로 달라질 수 있다. 이것을 방지하기 위해 서비스에 레포지토리 생성자를 만들고, @BeforEach를 통해 모든 테스트 코드 실행 직전에 레포지토리를 생성하도록 한다. 매번 새로운 객체를 생성하는 것이 아니라 생성자를 외부에서 주입하는 것을 DI(의존성 주입)라고 한다.
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
MemberService memberService;
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
참조
스프링 입문 - 김영한