Mockito란?

Mockito는 간단한 설정만으로 가짜(Mock) 객체를 생성하여 로직을 테스트할 수 있게 해주는 테스트 프레임워크입니다.
대부분의 객체 지향 프로그래밍(OOP) 기반 서비스는 다양한 의존 관계를 통해 기능을 제공하는데, 이런 의존 관계가 테스트를 어렵게 만드는 경우가 많습니다.
Mockito는 이러한 의존 관계를 가짜 객체(Mock)로 대체하여, 테스트하려는 핵심 로직에만 집중할 수 있도록 도와줍니다.


Mockito 주요 어노테이션

1. @Mock

  • 가짜 객체를 생성합니다.
  • 테스트하려는 클래스의 의존 관계를 대체하기 위해 사용됩니다.

2. @InjectMocks

  • @Mock 또는 @Spy로 생성된 객체를 테스트하려는 클래스에 자동으로 주입합니다.
  • 의존 관계가 자동으로 설정되므로 수동으로 객체를 생성하거나 주입할 필요가 없습니다.

3. @Spy

  • 원본 객체를 생성한 뒤, Stubbing되지 않은 메서드는 실제 메서드를 실행합니다.
  • 기본 생성자(NoArgsConstructor)가 필요합니다.

Mockito를 적용한 테스트 코드

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    @InjectMocks
    private UserService userService;

    @Mock
    private UserRepositoryValid repository;

    private final String userEmail = "admin@gmail.com";

    @Test
    void 새로운_유저_생성() {
        GetNewUserDto getNewUserDto = 유저_데이터_생성();
        userService.createNewUser(getNewUserDto);

        when(userService.findByUserEmail(userEmail)).thenReturn(stubbing());

        User user = userService.findByUserEmail(userEmail);
        assertThat(user.getEmail()).isEqualTo(userEmail);
    }
    
    GetNewUserDto 유저_데이터_생성() {
        return new GetNewUserDto(userEmail, "admin", "1234", "Student", "Default");
    }

    User stubbing() {
        return new User(new CreateNewUserDto(userEmail, "admin", "1234", UserType.Student, SsoType.Default));
    }
}

Stubbing이란?

Stubbing은 테스트 메서드가 실행된 후 어떤 값을 반환해야 하는지 개발자가 명시하는 과정입니다.
즉, "이 메서드가 실행되면, 이러한 결과를 반환한다" 라고 미리 지정하는 것입니다.
Stubbing은 데이터 검증보다는 테스트하려는 로직을 명확히 검증하는 데 중점을 둡니다.

예시:

when(repository.findByEmail(userEmail)).thenReturn(mockUser);
  • repository.findByEmail() 메서드를 호출하면, 실제 DB를 조회하지 않고 미리 설정한 mockUser 객체를 반환합니다.

Mockito 사용 시 주의점

  1. Null 또는 0 값 주의
    • @Mock으로 생성된 객체는 기본적으로 모든 데이터가 null 또는 0으로 초기화됩니다.
    • 따라서 데이터 검증 테스트에는 적합하지 않습니다.
  2. Stubbing 활용
    • 실제 데이터를 확인해야 하는 경우, Stubbing을 통해 예상 결과를 미리 설정할 수 있습니다.

Mockito의 장점

  1. 가짜 클래스를 직접 작성할 필요 없음
    • 간단한 어노테이션으로 Mock 객체를 생성할 수 있습니다.
  2. 독립적인 테스트 구현
    • 의존 관계를 Mock으로 대체해 테스트가 다른 클래스나 서비스에 의존하지 않도록 합니다.
  3. 엣지 케이스 검증 용이
    • 복잡한 로직의 엣지 케이스를 효과적으로 검증할 수 있습니다.

마무리

Mockito를 사용하면 테스트를 단순화하고, 로직 검증에 집중할 수 있습니다.
다만, 데이터 검증은 Repository 테스트에서 확인하고, Mockito 테스트에서는 로직 검증에 중점을 두는 것이 효과적입니다.
테스트를 체계적으로 작성하여 더 견고한 코드를 만들어 보세요!

 

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!


참고 문헌

참고문헌1

참고문헌2

'Spring' 카테고리의 다른 글

Spring에 예외처리 적용하기 With @RestControllerAdvice  (0) 2024.12.12
Spring에 Swagger 적용하기  (0) 2024.12.12
Spring에 DTO 적용하기  (0) 2024.12.09

+ Recent posts