이전 글에, Repository와 Service 를 구현했다.
참고로!!! 하나 수정한게 있다면
UserServiceLogic과 UserRepositioryLogic 파일의 위치를
logic이라는 패키지를 추가해서 그 안에 각각 넣어줬다.
기존에는 repository 패키지 안에 UserRepository와 UserRepositoryLogic이 같이 있었는데
logic이라는 하위 패키지를 하나 더 생성해서 UserRepositoryLogic은 그 안에 넣어줬다.
그리고 UserSerivceLogic도 이와 같이 해줬다.
단지 구분하기 편하게 이렇게 정리해주었다!!
다시 돌아와서..
이제 여태까지 만든 코드를 토대로 Unit Test를 진행해 볼 것이다. Junit version은 5를 이용한다.
Junit 버전에 따라 테스트 어노테이션이나 assert 이용 방법이 조금씩 다르니 주의한다.
Unit Test(단위 테스트)는 코드에 문제가 없는지, 코드를 유지관리하는데 아주 중요한 역할을 한다.
Unit Test를 하는 습관을 들여야 한다.
UnitTest는 WhiteBox Test이다.
그 결과를 미리 알고 (기대하는 값을 알고) 테스트 하는 메커니즘이다.
이번 시간에는 이전시간에 구현한 Repository와 Service를 테스트해 볼 것이다.
Service 안에서 Repository를 사용하므로, Service를 테스트해보면 되겠다.
우리가 구현한 UserService는 UserServiceLogic이었다.
test 폴더 안에, com.test.admin.service.logic 패키지를 추가했다.
일단 UserSerivceLogic의 구현부분을 테스트 할 것 이므로, UserSerivceLogic이 있는 위치와 동일한 패키지를 추가해주었고
그 안에 UserServiceLogicTest 클래스를 만들어주었다.
테스트 하고자 하는 클래스의 패키지와 같은 테스트 패키지를 만들어 주는 것이 보통의 관습.. 이고
테스트 클래스명 또한 테스트하려는 클래스 뒤에 Test를 붙이는게 관습이다.
그리고 간단하게 User에 대해 테스트를 진행해본다.
UserServiceLogic을 테스트함으로써, 자연스레 UserRepositoryLogic까지 테스트 한 겸이 된다.
주의할 점은
단위테스트로 DI를 할 경우에는 생성자로 인한 주입이 안된다. 따라서 @AutoWired만 사용해야 한다는 것을 주의한다.
package com.test.admin.service.logic;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.test.admin.service.UserService;
import com.test.admin.entity.User;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
public class UserServiceLogicTest { // 클래스명은 보통, 테스트할 클래스 뒤에 Test를 붙여서 사용
// UserServiceLogic을 주입(DI) 해야하는데, Test에서는 생성자를 이용한 주입이 안됨
// 따라서 @Autowired를 이용해서 주입해야만 한다.
@Autowired
private UserService userService;
@Test
public void registerTest() {
User sample = User.sample();
// sample을 등록, 그 리턴값이 sample.id와 같아야함
assertThat(this.userService.register(sample)).isEqualTo(sample.getId());
// sammple을 넣었으므로, 전체 갯수는 1개여야함
assertThat(this.userService.findAll().size()).isEqualTo(1);
}
}
이를 실행해보면 아래와 같은 결과를 볼 수 있다.
또한, 추가로 두 개의 어노테이션에 대해서 알아보자.
@BeforeEach와 @AfterEach가 있다.
단위테스트 각 함수들이 호출되기 전에 실행되는 함수를 만들고 싶으면
@BeforeEach
를 함수에 붙여준다.
단위테스트 각 함수들이 호출되고 난 뒤에 실행되는 함수를 만들고 싶으면
@AfterEach
를 함수에 붙여준다.
사용 예시는 아래와 같다.
package com.test.admin.service.logic;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.test.admin.service.UserService;
import com.test.admin.entity.User;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
public class UserServiceLogicTest { // 클래스명은 보통, 테스트할 클래스 뒤에 Test를 붙여서 사용
// UserServiceLogic을 주입(DI) 해야하는데, Test에서는 생성자를 이용한 주입이 안됨
// 따라서 @Autowired를 이용해서 주입해야만 한다.
@Autowired
private UserService userService;
private User kim;
private User lee;
@BeforeEach
public void startUp() {
this.kim = new User("Kim", "Kim@naver.com");
this.lee = new User("Lee", "Lee@naver.com");
this.userService.register(this.kim);
this.userService.register(this.lee);
}
@Test
public void registerTest() {
User sample = User.sample();
assertThat(this.userService.register(sample)).isEqualTo(sample.getId());
assertThat(this.userService.findAll().size()).isEqualTo(3); // 3명이 되었다.
this.userService.remove(sample.getId());
}
@Test
public void find() {
assertThat(this.userService.find(lee.getId())).isNotNull();
assertThat(this.userService.find(lee.getId()).getEmail()).isEqualTo(lee.getEmail());
}
@AfterEach
public void cleanUp() {
this.userService.remove(kim.getId());
this.userService.remove(lee.getId());
}
}
그럼
startUp() -> registerTest() -> cleanUp() ->
startUp() -> find() -> cleanUp()
이렇게 실행 될 것이다.
테스트 결과는 성공
'[SpringBoot]' 카테고리의 다른 글
DI (Dependency Injection) 3가지 (0) | 2022.12.10 |
---|---|
SpringBoot 간단 실습 - 3 Controller, RestClient 활용 (1) | 2022.12.10 |
@Autowired 의존성 주입이 안된다면 / NULL (0) | 2022.12.08 |
SpringBoot 간단 실습 - 1 엔티티 생성 / 서비스 생성 (0) | 2022.12.04 |
SpringBoot 프로젝트 생성하기 (0) | 2022.12.03 |