* 인프런 김영한 강사님의 스프링 입문 강의 정리
지난 강의에서 작성한 리포지토리와 서비스에 대해 각각 테스트 케이스를 작성한다.
테스트는 src/test/java의 하위 폴더에 생성하며 main의 구조를 그대로 가져온다.
자바는 JUnit 프레임 워크로 테스트를 실행한다.
JUnit?
- java에서 단위테스트(unit test)를 지원해주는 프레임워크
- assert()로 테스트 판별
- 테스트 어노테이션을 제공한다. ex) @Test, @Before..
** ctrl+shift+T - 테스트 클래스 파일을 자동으로 생성해준다.
▶ 리포지토리(memoryMemberRepository) 테스트
package myStudyspring.myStudyspring.repository;
import myStudyspring.myStudyspring.domain.member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
//테스트는 순서의 의존관계 없이 설계가 되어야함
class memoryMemberRepositoryTest {
memoryMemberRepository repository = new memoryMemberRepository();
@AfterEach
public void afterEach(){
repository.clearStore();
//테스트가 실행되고 끝날 때마다 저장소 클리어 -> 테스트 시 필요
}
@Test
public void save(){
member member = new member();
member.setName("spring");
repository.save(member);
//optional로 리턴되므로 get으로 데이터를 꺼냄
member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
@Test
public void findByName(){
member member1 = new member();
member1.setName("spring1");
repository.save(member1);
member member2 = new member();
member2.setName("spring2");
repository.save(member2);
member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll() {
member member1 = new member();
member1.setName("spring1");
repository.save(member1);
member member2 = new member();
member2.setName("spring2");
repository.save(member2);
List<member> result = repository.findAll();
assertThat(result.size()).isEqualTo(2);
}
}
*한번에 테스트를 진행할 경우 메모리에 직전의 결과가 남아 에러가 날 수 있다.
*@AfterEach() : 각 테스트가 종료될 때마다 실행하는 어노테이션으로
예제에서는 리포지토리의 clearStore()를 실행하여 메모리를 비워준다.
*결론적으로 테스트는 독립성이 있어야하며 순서에 의존 관계가 있는 것은 좋은 테스트라 할 수 없다.
*Assertions
테스트 결과를 확인할 때 사용한다.
import static org.assertj.core.api.Assertions.*;
위와 같이 static import 를 하고
assertTaht(data).isEqualTo(data2);
로 사용한다.
▶ 서비스(MemberService) 테스트
package myStudyspring.myStudyspring.service;
import myStudyspring.myStudyspring.domain.member;
import myStudyspring.myStudyspring.repository.memoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
//c+shi+t -> 자동으로 테스트 클래스 생성
class MemberServiceTest {
MemberService memberService;
memoryMemberRepository repository;
@BeforeEach
public void beforeEach(){
repository = new memoryMemberRepository();
memberService = new MemberService(repository);
}
@AfterEach
public void afterEach(){
repository.clearStore();
}
@Test
void join() {
//given
member member = new member();
member.setName("hello");
//when
Long saveId = memberService.join(member);
//then
member findMember = repository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@Test
public void 중복회원예외(){
//given
member member1 = new member();
member1.setName("spring");
member member2 = new member();
member2.setName("spring");
//when
memberService.join(member1);
//방법 1 - assertThrows 사용
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//방법 1 - try-catch 사용
/* try {
memberService.join(member2);
fail();
}catch(IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}*/
}
}
*@BeforeEach() : 각 테스트가 실행 전에 호출된다. 테스트가 서로 영향이 없도록 새로운 객체를 항상 생성한다.
- memberService에서 생성한 리포지토리 객체가 있고 테스트 클래스에서도 또 객체를 생성하면 두개의 다른 객체가 만들어진다.
따라서 서비스에서는 리포지토리 객체를 생성하지 않고,
테스트에서는 테스트 실행 전 리포지토리 객체를 생성한다.
//[MemberService]
private final memberRepository memberRepository;
public MemberService(memberRepository memberRepository){
this.memberRepository = memberRepository;
}
//[MemberServiceTest]
MemberService memberService;
memoryMemberRepository repository;
@BeforeEach
public void beforeEach(){
repository = new memoryMemberRepository();
memberService = new MemberService(repository);
}
'컴퓨터 > Spring Boot' 카테고리의 다른 글
[TIL] Spring Boot(intellij) - 홈 화면, 회원 등록, 조회 개발 (0) | 2023.05.30 |
---|---|
[TIL] Spring Boot(intellij) - 스프링 빈과 의존 관계 (0) | 2023.05.27 |
[TIL] Spring Boot(intellij) - 회원 관리 개발(1) (0) | 2023.05.25 |
[TIL] Spring Boot(intellij) - 템플릿 엔진과 API (0) | 2023.05.24 |
[TIL] Spring Boot(intellij) - 프로젝트 생성 (0) | 2023.05.23 |