김민주

[TIL] 241115 - Mockito 기반 테스트 코드 작성 본문

STUDY/TIL

[TIL] 241115 - Mockito 기반 테스트 코드 작성

7alswn 2024. 11. 15. 15:58

Do - List

  • 코드카타 (Java 10문제)
  • 테스트 코드 작성법 정리
  • User 테스트 코드 작성 시작
  • 코드 리뷰 + PR + Merge

테스트 코드 작성법

Mockito란?

Mockito는 Java 애플리케이션에서 단위 테스트를 쉽게 작성할 수 있도록 돕는 Mocking 프레임워크입니다.

Spring 개발 시 여러 객체들 간의 의존성이 생기는데, 이러한 의존성을 해결하기 위해 객체의 의존성을 가짜(Mock)로 대체하여 특정 동작이나 반환값을 지정할 수 있습니다. 이를 통해 실제 의존 객체의 상태나 동작에 영향을 받지 않고 독립적인 테스트를 수행할 수 있습니다.

테스트 코드 작성법

1. Mockito 설정

Mockito를 사용하려면 pom.xml 또는 build.gradle에 의존성을 추가해야 합니다.

testImplementation 'org.mockito:mockito-core:4.6.1' // gradle 의존성

 

2. 기본 사용법

기본적으로 Mockito는 테스트 대상 클래스에서 필요한 의존성을 Mock 객체로 대체합니다.

예를 들어, UserService 클래스가 UserRepository에 의존한다고 가정해 보겠습니다.

 

3. 테스트 대상 클래스 예시

  • UserService
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findUserByUsername(String username) {
        return userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));
    }
}
  • UserRepository
public interface UserRepository {
    Optional<User> findByUsername(String username);
}

 

4. Mockito 테스트 작성하기

UserService의 findUserByUsername 메서드를 테스트하는 코드를 작성합니다.

public class UserServiceTest {

    @Mock
    private UserRepository userRepository; // Mock 객체 생성

    @InjectMocks
    private UserService userService; // Mock 객체가 주입된 UserService 생성

    @BeforeEach
    public void setup() {
        MockitoAnnotations.openMocks(this); // Mockito 초기화
    }

    @Test
    public void testFindUserByUsername_UserExists() {
        // 가짜 User 객체 설정
        User mockUser = new User("testUser", "password");
        when(userRepository.findByUsername("testUser")).thenReturn(Optional.of(mockUser));

        // 실제 테스트 수행
        User result = userService.findUserByUsername("testUser");

        // 결과 검증
        assertEquals("testUser", result.getUsername());
        assertEquals("password", result.getPassword());
    }

    @Test
    public void testFindUserByUsername_UserNotFound() {
        // 존재하지 않는 사용자의 경우 Optional.empty() 반환
        when(userRepository.findByUsername("unknownUser")).thenReturn(Optional.empty());

        // 예외 발생 테스트
        assertThrows(RuntimeException.class, () -> userService.findUserByUsername("unknownUser"));
    }
}

 

  • @Mock: UserRepository 인터페이스를 Mock 객체로 만듭니다.
  • @InjectMocks: UserService 클래스에 @Mock으로 생성된 의존성을 주입합니다.
  • MockitoAnnotations.openMocks(this): @Mock 및 @InjectMocks가 있는 객체를 초기화합니다.
  • when(...).thenReturn(...): 특정 메서드 호출에 대해 반환값을 지정합니다.
  • assertThrows: 예외가 발생하는지 검증합니다.

5. 유용한 Mockito 메서드

  • verify(mock).method(): Mock 객체의 특정 메서드가 호출되었는지 확인합니다.
  • doThrow(...).when(mock).method(): 메서드 호출 시 예외를 발생시키도록 설정합니다.

 

'STUDY > TIL' 카테고리의 다른 글

[TIL] 241119 - delivery project 결과물  (1) 2024.11.19
[TIL] 241118 - EC2에서 Docker Compose하기  (3) 2024.11.18
[TIL] 241114  (0) 2024.11.14
[TIL] 241113  (0) 2024.11.14
[TIL] 241112 - AI API 키 발급 및 테스트  (2) 2024.11.12