[Spring] JUnit 단위테스트 요령
개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드, 웹 환경에서는 컨트롤러를 통해서 해당 기능을 실행할 수 있다. 이러한 방법은 준비 실행 과정이 너무 오래걸리고, 반복 실행하기 어렵고, 여러 테스트를 한번에 실행하기 어려운 단점이 있다.
그렇기 때문에 자바는 JUnit이라는 프레임 워크로 테스트를 실행해서 이러한 문제를 해결한다.
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member ;
}
}
위 레파지토리 코드의 동작을 테스트하고자 한다.
class MemoryMemberRepositoryTest { // public 선언은 없어도 됨
MemberRepository repository = new MemoryMemberRepository(); // 테스트 대상 객체 선언
@Test //테스트 대상 명시 어노테이션
public void save() {
Member member = new Member(); //테스트 로직부
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get(); // 출력 값 result에 저장
Assertions.assertEquals(result, member); // junit 비교 문
}
}
JUnit 테스트 코드이다. 스프링 레거시와 부트에서 방식차이는 크게 없는 것 같다.
테스트 코드를 작성하는 클래스 파일은 관례적으로 파일명 접미사로 Test를 붙여준다.
실행하면 위와 같은 성공한 출력 화면을 볼 수 있다.
JUnit으로 작성된 테스트 파일은 실행할 때 프레임워크에서 처리해주어 main method를 별도로 명시해주지 않아도 실행할 수 있다.
임의로 null값을 준 모습이다. 로그와 함께 실패한 화면를 볼 수 있다.
System.out.println(result == member); 구문으로도 테스트를 할 수 있지만 테스트 출력에 대한 데이터를 얻을 수가 없다. 그렇기 때문에 assertions 메소드를 사용하여 테스트를 한다.
앞에선 Assertions 메소드를 import할 때 org.junit.jupiter.api를 사용하였지만
위와 같이 org.assertj.core.api 로도 사용할 수 있으며 테스트 구문은 아래와 같이 바뀐다.
Assertions.assertThat(member).isEqualTo(result);
assertEquals(expected, actual)와 기능은 똑같다. 차이점 으로는 대상과 비교하는 매개변수가 무엇인지를 더 직관적으로 볼 수 있다.
어느 강좌나 아티클을 보아도 테스트의 중요성을 항상 강조한다.
이 글에서는 가벼운 사용 요령에 대해서만 다루었지만 테스트 케이스 또한 꼼꼼하게 공부해야할 부분이 많다.
깊이있게 파고들어가야 할 파트인 것 같다.