개발에 있어서 테스트 코드는 매우 중요한 역할을 한다. 테스트 코드가 없다면, main 메서드를 일일이 실행하거나, 컨트롤러를 통해 실행해야 하는데 이렇게 되면 반복적으로 실행하기에 너무 귀찮고 힘든 일이다. 따라서 이를 자동화 해주는 것이 필요하겠다.
이전 블로그에서, 함수를 실행하는 main 디렉토리와 test 디렉토리가 프로젝트 안에 나뉘어져 있는 것이 Spring의 설정이라고 말한 적이 있다. 지금은 테스트 코드를 작성해야 하므로, 당연히 test 디렉토리 안에서 작업이 이루어져야겠다.
보통 테스트코드를 작성하는 파일의 이름은 main 메서드에서 실행하는 파일의 이름뒤에 Test만 붙여서 작명한다.
package repository;
import Goat.CouponCheck.repository.MemoryRepository;
import hello.hellospring.domain.Member;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class MemoryRepositoryTest {
MemoryRepository repository = new MemoryRepository();
@Test
public void save(){
hello.hellospring.domain.Member member = new Member();
member.setName("goat");
repository.saveMember(member);
Member result = repository.findById(member.getId()).get();
Assertions.assertEquals(member,result);
//혹은 다음 코드로 작성하기도 한다. 아래 코드로 받아들일것.
Assertions.assertThat(member).isEqualTo(result); //이때 불러오는 라이브러리는 assertj에서 불러와야함.
//이 때, Assertions의 option (alt + enter) 를 보면 static import로 Assertions라이브러리를 불러오면, assertThat을 바로 쳐도 Assertions가 바로 불러와지기 때문에 더 간편히 만들 수 있다.
}
}
전체 자바 코드
package repository;
import Goat.CouponCheck.repository.MemoryRepository;
import hello.hellospring.domain.Member;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class MemoryRepositoryTest {
MemoryRepository repository = new MemoryRepository();
@Test
public void save(){
hello.hellospring.domain.Member member = new Member();
member.setName("goat");
repository.saveMember(member);
Member result = repository.findById(member.getId()).get();
//Assertions.assertEquals(member,result);
assertThat(member).isEqualTo(result);
}
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("hoon1");
repository.saveMember(member1);
Member member2 = new Member();
member2.setName("hoon2");
repository.saveMember(member2);
Member result = repository.findByName("hoon1").get();
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll(){
Member member1 = new Member();
member1.setName("hoon1");
repository.saveMember(member1);
Member member2 = new Member();
member2.setName("hoon2");
repository.saveMember(member2);
List<Member> result = repository.findAll();
assertThat(result.size()).isEqualTo(2);
}
@Test
public void saveCoupon(){
Coupon coupon = new Coupon();
coupon.setNum();
assertThat(coupon.getNum()).isEqualTo(9);
}
//coupon 0 개 예외 추가 테스트 작성할것.
@Test
public void saveOverCoupon(){
Coupon coupon = new Coupon();
for (int i = 0; i<11; i++){
coupon.setNum();
}
assertThat(coupon.getNum()).isEqualTo(null);
}
}
이 코드 전체를 실행하면 테스트코드가 실패했다고 뜬다. 왜 이럴까?
서로서로 test code를 실행할 때, 한 메서드에서 진행되었던 repository의 변화 과정이 다른 메서드에도 영향을 주기 때문이다. 이 때, 이를 방지하기 위해 test메서드하가 하나 종료되면, repository를 clear하는 과정이 있어야만 한다. = AfterEach Annotation 활용
@AfterEach
public void afterEach(){
repository.clearStore();
}
다음과 같은 코드를 추가시킨다. 물론 repository, 즉, MemoryRepository class 에는 clearStore()함수가 정의가 되어야겠다. 해당 함수는 당연히 clear하는 코드가 작성 되어야 할 것이다. (github 코드 참조)