본문 바로가기
Spring

Spring Day 20 : Mockito

by 우 석 2024. 2. 21.

단위 테스트를 하기 위해서 test 코드를 작성하려고 한다.

단위 테스트는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위이다. 즉, 하나의 메서드에는 하나의 기능이 들어가도록 작성하며, 가장 작은 단위를 테스트하는 것이 목표다.

 

하지만 하나의 메서드를 테스트하기 위해서 의존성을 가지는 다른 객체가 사용되기에 테스트의 결과에 영향을 준다.

 

다시 말해 단위 테스트를 작성할 경우 해당 객체에 대한 기능만 테스트하고 싶은데 의존성을 가진 다른 객체가 사용된다.

 

의문

  • 테스트 범위가 Controller, Service, Repository 인  Controller 클래스만 테스트할 수 있는 방법 
  • 테스트 범위: Service, Repository 인 Service 클래스만 테스트할 수 있는 방법
  • 테스트 범위: Repository 인 Repository 클래스만 테스트할 수 있는 방법

 -> 이러한 문제의 해결방법 중 하나는 가짜 객체(Mock object)를 생성하는 것이다.


Mockito

가짜 객체를 만들어주는 테스트 프레임워크로 복잡한 연관성을 가진 코드를 테스트할 때 독립적인 테스트를 진행하기 위해 가짜 객체를 만들어서 테스트를 진행할 수 있다.


각 테스트 케이스를 서로 분리하기 위해 가짜 객체 (Mock object) 생성 및 분리



위 그림에서 MockRepository의 역할은 실제 객체와 겉만 같은 객체로 동일한 클래스명, 함수명을 가진다. 또한 실제 DB 작업은 하지 않으며 테스트를 위해 필요한 결과값을 return 한다.

<Mockito 사용 코드>

@ExtendWith(MockitoExtension.class)
class TodoServiceTest {

    @InjectMocks
    private TodoService todoService;
    @Mock
    private TodoRepository todoRepository;
    User user;

    @BeforeEach
    void setUp() {
        user = new User("blue", "blue1234");
    }

    @Test
    @DisplayName("Todo 생성 - 성공")
    void postTodo_Success() {
        // given
        TodoRequestDto requestDto = MockData.getTodoRequestDto_Success();
        given(todoRepository.save(any(Todo.class))).willAnswer(
                invocation -> invocation.<Todo>getArgument(0));

        // When
        TodoResponseDto responseDto = todoService.postTodo(requestDto, user);

        // Then
        assertThat(responseDto.getTitle()).isEqualTo("Todo Title");
        assertThat(responseDto.getContent()).isEqualTo("Todo Content");
    }
 }

 

<코드 설명>

@ExtendWith(MockitoExtension.class): Mockito를 사용하기 위한 확장 어노테이션
@InjectMocks: Mock 객체들을 주입받을 대상인 TodoService 객체 생성
@Mock: TodoRepository의 Mock 객체 생성

TodoRequestDto 객체를 MockData에서 가져와서
todoRepository.save(any(Todo.class)) 메서드 호출 시, 전달된 Todo 객체를 반환하도록 Mock 설정
todoService.postTodo(requestDto, user)를 호출하여 TodoResponseDto 객체를 받아 TodoResponseDto 객체의 제목과 내용을 검증