본문으로 바로가기

[SpringBoot] Junit 으로 단위테스트 하기

category Java/Spring 2022. 6. 17. 15:55

Junit

: Java 에서 단위테스트를 위한 테스트 도구

 

 

Dependency(gradle): 

testImplementation 'org.springframework.boot:spring-boot-starter-test'

 

SpringBoot 프로젝트를 생성하면 src 폴더 밑에 test 라는 폴더가 생성된다. 

아래 test 폴더에 패키지를 만들고 단위테스트를 작성할 수 있다. 

폴더 예시

 

 

 

단위테스트 예시

 

Repository

 

Service

 

 

 

회원을 관리하는 Repository와 비즈니스 로직을 수행하는 Service 코드를 작성했다. 

MemberService의 join은 우선 이름 중복검사를 한 후에, map 에 member를 저장하는 기능을 제공한다. 

 

 

여기서 MemberService의 Join 함수에 대해 단위테스트를 작성할 수 있다. 

 

 

 

@Test 어노테이션을 통해 테스트를 진행할 수 있다. 

 

spring 이라는 이름을 가진 멤버 객체를 생성하고 

join을 한 후에 해당 이름을 가진 멤버가 존재하는지 테스트하는 코드이다. 

 

memberService.join()을 실행한 후에

 

Junit 에 포함되어있는 Assertions 의 assertThat().isEqualTo() 함수를 통해 처음에 만든 멤버의 이름이 존재하는지 검사하는 테스트이다. 

 

그외 isNotEqualTo, isBetween, instanceOf... 등으로 다양하게 결과값을 체크할 수 있다. 

 

 

 

위 테스트를 실행하면 초록색과 함께 성공 표시가 나타난다. 

 

 

 

Exception 단위테스트

 

위 MemberService 에서 Duplicate를 보면 Exception 을 던지는 구문이 있다. 

Exception 테스트 예제는 다음과 같다. 

 

 

 

Junit Assertions 에서 assertThrows를 제공하고 있으며

assertThrows( Exception.class, () -> 테스트할 함수); 로 예외를 가져올 수 있다. 

 

예외를 가져온 후에 assertThat( e.getMessage()).isEqualTo() 로 에러 메세지의 검증 또한 할 수 있다. 

 

 

assertj, assertThatThrownBy 로 하는 방법 -> 

 

 

만약 Exception 을 커스텀해서 사용해서 특정 필드를 검사해야한다면, 

 

로 검증할 수 있다. 

 

 

 

그리고 테스트마다 초기화 작업이라던지

후속 조치가 필요할 때가 있다. 

 

 

@BeforeEach : 각 테스트 전에 수행하는 코드

@Before: 테스트 전 수행

@AfterEach: 각 테스트 이후 수행되는 코드 

@After... 등등

 

 

예시

 

위 테스트 에서는 Service 가 생성될 때 Repository를 주입시켜야 작동할 수 있다. 

 

BeforeEach를 통해 Repositor를 주입하고 테스트를 수행하도록 작성했다. 

 

현재 위 코드는 static 한 Map 에 회원정보를 담아두고있어서 하나의 테스트가 끝나면 Map 을 비워주어야 다음 테스트에 영향이 가지 않는다. 

 

따라서 @AfterEach 를 통해 MemberMap 을 비워주도록 설정할 수 있다.