인프런 김영한님의 스프링 강의를 듣고 정리한 내용입니다. 출처
개발한 기능을 테스트할때 main메서드를 통해 실행하거나 웹 애플리케이션의 컨트롤러를 통해 실행하게되면, 준비하고 실행하는데 오래 걸리고 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다.
jUnit이라는 프레임워크로 테스트를 실행해서 문제를 해결할수있다.
테스트코드는 src/test/java
하위 폴더에 생성한다.
package hello.hellospring.repository;
import hello.hellospring.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);
Member result = repository.findbyId(member.getId()).get();
assertThat(member).isEqualTo(result);
}
@Test
public void findByName(){
Member member = new Member();
member.setName("spring1");
repository.save(member);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring2").get();
assertThat(result).isEqualTo(member2);
}
@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);
}
}
테스트 대상 클래스의 객체를 만들어준 뒤 테스트 하려는 메소드 위에 @Test를 작성해주면 된다.
한번에 여러 테스트를 실행하게되면 메모리 DB에 직전 테스트의 결과가 남아서 다음 테스트에 영향을 줄 수있다.
@AfterEach를 사용하면 각 테스트가 종료될때마다 이 기능을 실행하게된다.
여기서 저장된 데이터를 지워주게되면 각 테스트를 독립적으로 실행할수있다.
테스트 결과를 확인할때는 콘솔로 직접 출력해보거나,
Assertions.assertEquals(기댓값, 실제값)
Assertions.assertThat()
을 사용하며, 보통 assertThat을 사용한다.
2022-01-05 추가
@SpringBootTest를 사용하면 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional을 사용하면 테스트 시작 전에 트랜잭션을 시작하고 테스트 완료 후에 항상 롤백해주기 때문에 다음 테스트에 영향을 주지 않는다.