JUnit 5(Jupiter)와 Mockito를 이용한 단위 테스트
1. 의존성 설정
JUnit 5와 Mockito를 사용하여 단위 테스트를 진행하려면 먼저 프로젝트에 필요한 의존성을 추가해야 합니다. Spring Boot 환경에서 테스트를 진행할 경우 아래와 같이 build.gradle 또는 pom.xml에 추가하면 됩니다.
// build.gradle
testImplementation("org.mockito:mockito-core")
testImplementation("org.mockito:mockito-junit-jupiter")
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2. User 엔티티
아래는 User 엔티티의 예제 코드입니다. @Entity와 @Table 어노테이션을 사용하여 데이터베이스 테이블과 매핑되도록 구성했습니다.
@Entity
@Table(name = "users")
@NoArgsConstructor
@Data
@ToString
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userNumber;
private String name;
private String userId;
private String password;
private String role;
@Builder
public User(String name, String userId, String password, String role) {
this.name = name;
this.userId = userId;
this.password = password;
this.role = role;
}
}
3. UserService 클래스
User 정보를 관리하는 UserService 클래스입니다. userRepository.findByUserId(id)를 이용해 특정 userId에 해당하는 사용자를 조회하는 기능을 제공합니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(String id) {
return userRepository.findByUserId(id);
}
}
4. UserRepository 인터페이스
Spring Data JPA를 이용하여 User 엔티티를 관리하는 UserRepository를 정의합니다.
public interface UserRepository extends JpaRepository<User, Long> {
// userId로 검색
User findByUserId(String userId);
}
5. UserService 단위 테스트
이제 JUnit 5와 Mockito를 활용하여 UserService의 getUserById 메서드를 테스트해 보겠습니다.
테스트 코드
import org.example.todo.entity.User;
import org.example.todo.repository.UserRepository;
import org.example.todo.service.UserService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void testGetUserById() {
// Given
User user = new User("한국", "korea", "12345", "일반유저");
user.setUserNumber(1L);
when(userRepository.findByUserId("korea")).thenReturn(user);
// When
User findUser = userService.getUserById("korea");
// Then
assertEquals("한국", findUser.getName());
}
}
어노테이션 설명
- @ExtendWith(MockitoExtension.class): Mockito를 활성화하여 @Mock 및 @InjectMocks 어노테이션을 사용할 수 있도록 해줍니다.
- @Mock: 실제 데이터베이스에 접근하지 않고 가짜 객체(Mock)를 생성하여 UserRepository를 대신합니다.
- @InjectMocks: UserService 객체를 생성하고 @Mock으로 생성된 UserRepository 객체를 자동으로 주입합니다.
6. Given/When/Then 패턴
- Given : 어떠한 데이터가 주어질 때.
- When : 어떠한 기능을 실행하면.
- Then : 어떠한 결과를 기대한다.
Give
테스트에 사용할 가짜 user 객체를 생성
User user = new User("한국", "korea", "12345", "일반유저");
when(userRepository.findByUserId("korea")).thenReturn(user);
⇒ userRepository.findByUserId가 호출되었을시 thenReturn 을 통해user 객체를 반환하도록 설정
when
실제로 테스트해야할 서비스의 메소드를 실행시켜 원하는값을 반환하도록 한다.
User findUser = userService.getUserById("korea");
이렇게 하면 userService의 getUserById 에서 userRepository.findByUserId호출되고
이는 우리가 만들어둔 user객체를 반환 하도록 한다.
Then
when 에서 반환된 값이 예상하는 결과 하고 받는지 검증하는 부분이다
assertEquals을 사용하여 원하는 결과값하고 비교할수 있습니다.
assertEquals("한국", findUser.getName());
'자바 공부 > 스프링공부' 카테고리의 다른 글
스프링 - 이메일 인증 (0) | 2025.01.14 |
---|---|
스프링부트 시큐리티(Security) 6 config 작성방법 (1) | 2024.09.27 |
스프링 부트 웹소켓 Stomp 사용법 (0) | 2024.09.19 |
스프링부트 Scheduled 사용법 (1) | 2024.09.17 |
스프링부트 메이븐 - MyBatis 사용법 (2) | 2024.09.04 |