스프링 테스트 예제

스프링 공부

목록 보기
25/35

JUnit 5 + Mockito + AssertJ를 활용한 Spring 테스트 예제

이 조합을 사용하면 단위 테스트를 효율적으로 작성할 수 있습니다.
각 프레임워크의 역할은 다음과 같습니다.

프레임워크역할
JUnit 5테스트 실행 및 테스트 케이스 관리
MockitoMock 객체 생성 및 행위 검증
AssertJ가독성이 좋은 단언(Assertion) 제공

1. 프로젝트 환경 설정 (Gradle/Maven)

JUnit 5, Mockito, AssertJ를 사용하려면 아래 라이브러리를 추가해야 합니다.

📌 Gradle

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'
}

📌 Maven

<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>

2. 예제 코드

가정할 서비스 & 리포지토리 구조

// 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";
    }
}

3. JUnit 5 + Mockito + AssertJ를 활용한 단위 테스트

📌 UserService를 테스트하는 코드

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);
    }
}

4. 코드 설명

Mockito를 사용한 Mock 객체 생성

userRepository = Mockito.mock(UserRepository.class);
  • UserRepository의 Mock 객체를 생성하여 가짜 데이터를 반환하도록 설정합니다.
  • 실제 데이터베이스에 접근하지 않고 단위 테스트를 수행할 수 있습니다.

Mockito를 사용한 동작 설정

when(userRepository.findById(userId)).thenReturn(new User(userId, "Alice"));
  • 특정 ID의 사용자가 존재할 때, findById(userId)가 호출되면 new User(userId, "Alice")를 반환하도록 설정합니다.

AssertJ를 사용한 결과 검증

assertThat(userName).isEqualTo("Alice");
  • AssertJ를 사용하면 assertEquals()보다 가독성이 좋은 문법으로 결과를 검증할 수 있습니다.

Mockito를 사용한 호출 횟수 검증

verify(userRepository, times(1)).findById(userId);
  • findById(userId) 메서드가 정확히 한 번만 호출되었는지 확인합니다.

5. JUnit 5 + Mockito + AssertJ를 사용하는 이유

특징JUnit 5MockitoAssertJ
역할테스트 실행 및 관리Mock 객체 생성 및 검증가독성 높은 검증
장점최신 테스트 기능 제공DB 접근 없이 단위 테스트 가능assertThat() 문법으로 직관적 검증
활용 예시@Test, @BeforeEachwhen(), verify()assertThat().isEqualTo()

6. 결론

  1. JUnit 5 → 최신 테스트 기능 제공
  2. Mockito → 데이터베이스 없이 단위 테스트 가능
  3. AssertJ → 직관적인 단언문 제공

이 조합을 사용하면 효율적인 단위 테스트를 작성할 수 있습니다.
따라서, Spring 프로젝트에서는 JUnit 5 + Mockito + AssertJ 조합이 가장 많이 사용됩니다. 🚀

profile
AI 답변 글을 주로 올립니다.

0개의 댓글