이 조합을 사용하면 단위 테스트를 효율적으로 작성할 수 있습니다.
각 프레임워크의 역할은 다음과 같습니다.
| 프레임워크 | 역할 |
|---|---|
| JUnit 5 | 테스트 실행 및 테스트 케이스 관리 |
| Mockito | Mock 객체 생성 및 행위 검증 |
| AssertJ | 가독성이 좋은 단언(Assertion) 제공 |
JUnit 5, Mockito, AssertJ를 사용하려면 아래 라이브러리를 추가해야 합니다.
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
testImplementation 'org.mockito:mockito-core:5.2.0'
testImplementation 'org.assertj:assertj-core:3.24.2'
}
<dependencies>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<!-- Mockito -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
<!-- AssertJ -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.24.2</version>
<scope>test</scope>
</dependency>
</dependencies>
// User 엔티티
public class User {
private Long id;
private String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() { return id; }
public String getName() { return name; }
}
// UserRepository (가짜 데이터베이스 역할)
public interface UserRepository {
User findById(Long id);
}
// UserService (비즈니스 로직)
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserName(Long id) {
User user = userRepository.findById(id);
return (user != null) ? user.getName() : "Unknown";
}
}
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
class UserServiceTest {
private UserRepository userRepository;
private UserService userService;
@BeforeEach
void setUp() {
// Mock 객체 생성
userRepository = Mockito.mock(UserRepository.class);
userService = new UserService(userRepository);
}
@Test
void testGetUserName_WhenUserExists() {
// Given: 특정 ID의 사용자 존재
Long userId = 1L;
when(userRepository.findById(userId)).thenReturn(new User(userId, "Alice"));
// When: 서비스 호출
String userName = userService.getUserName(userId);
// Then: 결과 검증
assertThat(userName).isEqualTo("Alice");
}
@Test
void testGetUserName_WhenUserDoesNotExist() {
// Given: 특정 ID의 사용자가 없음
Long userId = 2L;
when(userRepository.findById(userId)).thenReturn(null);
// When: 서비스 호출
String userName = userService.getUserName(userId);
// Then: 결과 검증
assertThat(userName).isEqualTo("Unknown");
}
@Test
void testGetUserName_CallsRepositoryOnce() {
// Given
Long userId = 3L;
when(userRepository.findById(userId)).thenReturn(new User(userId, "Bob"));
// When
userService.getUserName(userId);
// Then: findById가 1번만 호출되었는지 검증
verify(userRepository, times(1)).findById(userId);
}
}
✅ Mockito를 사용한 Mock 객체 생성
userRepository = Mockito.mock(UserRepository.class);
UserRepository의 Mock 객체를 생성하여 가짜 데이터를 반환하도록 설정합니다. ✅ Mockito를 사용한 동작 설정
when(userRepository.findById(userId)).thenReturn(new User(userId, "Alice"));
findById(userId)가 호출되면 new User(userId, "Alice")를 반환하도록 설정합니다.✅ AssertJ를 사용한 결과 검증
assertThat(userName).isEqualTo("Alice");
AssertJ를 사용하면 assertEquals()보다 가독성이 좋은 문법으로 결과를 검증할 수 있습니다. ✅ Mockito를 사용한 호출 횟수 검증
verify(userRepository, times(1)).findById(userId);
findById(userId) 메서드가 정확히 한 번만 호출되었는지 확인합니다. | 특징 | JUnit 5 | Mockito | AssertJ |
|---|---|---|---|
| 역할 | 테스트 실행 및 관리 | Mock 객체 생성 및 검증 | 가독성 높은 검증 |
| 장점 | 최신 테스트 기능 제공 | DB 접근 없이 단위 테스트 가능 | assertThat() 문법으로 직관적 검증 |
| 활용 예시 | @Test, @BeforeEach | when(), verify() | assertThat().isEqualTo() |
이 조합을 사용하면 효율적인 단위 테스트를 작성할 수 있습니다.
따라서, Spring 프로젝트에서는 JUnit 5 + Mockito + AssertJ 조합이 가장 많이 사용됩니다. 🚀