[Mockito] Mock 객체 만들기

위 프로젝트를 참고하여 기본적인 웹 애플리케이션 코드를 꼭 확인하자!
(StudyService , MemberService, StudyRepository)



Mock 객체 생성하기

개요

Mock 객체 생성 방법의 종류

Mock 객체를 만드는 방법에는 총 2가지의 방법이 존재한다.

  • Mockito.mock() 메서드로 만드는 방법
  • @Mock 애너테이션으로 만드는 방법


Mock 객체가 필요한 경우

  • 어떤 인터페이스의 구현체가 필요하지만, 아직 구현체를 작성하지 않은 경우
  • 예시 프로젝트에서의 필요성
    • MemberService 인터페이스만 존재하는 상태 (구현체 존재X)
    • StudyRepository 인터페이스만 존재하는 상태 (구현체 존재X)
    • StudyService 클래스의 생성자 형태

        public class StudyService {
        	private MemberService memberService;
        	private StudyRepository studyRepository;
      
        	//기본 생성자 생략
      
        	public StudyService(MemberService memberService, StudyRepository studyRepository) {
        		this.MemberService memberService = MemberService memberService;
        		this.StudyRepository studyRepository = StudyRepository studyRepository;
        	}
      
        }
      
    • 이때, StudyService 클래스를 테스트 하고 싶다면?
      1. StudyService 클래스의 생성자를 통해 객체를 생성해야한다.
      2. 하지만, MemberService 와 StudyRepository 인터페이스만 존재하고 구현체가 존재하지 않는다.
      3. 이때 Mock 객체를 사용하면 된다! (즉, Mock 객체로 의존성을 주입한다.)



Mock 객체 생성: Mockito.mock()

형식

Mock객체로_만들_인터페이스 mock = mock(Mock객체로_만들_인터페이스.class);


사용 예시

import static org.mockito.Mockito.*;
//나머지 import 생략

class StudyServiceTest {

  /**
   * Mockito.mock() 으로 mock 객체 만들기
   */
  @Test
  void createStudyServiceWithMethod() {
    /*
     StudyService 생성자의 인수로
     'MemberService'객체와, 'StudyRepository' 객체를 넣어야하지만
     현재 인터페이스만 존재하는 상황이다.
     따라서, mock 객체를 통해 StudyService 객체를 생성할 수 있다.
     */
    MemberService memberService = mock(MemberService.class);
    StudyRepository studyRepository = mock(StudyRepository.class);

		//Mock 객체로 의존성이 주입되었다.
    StudyService studyService = new StudyService(memberService, studyRepository);
    assertNotNull(studyService);
  }
}



Mock 객체 생성: @Mock

형식: 필드

@ExtendWith(MockitoExtension.class)
public class 테스트클래스 {
	//필드
	@Mock Mock객체로_만들_인터페이스 mock;

}
  • @ExtendWith(MockitoExtension.class) 로 Mockito 확장모델을 적용해야 @Mock 을 사용할 수 있다.


형식: 메서드 매개변수

@ExtendWith(MockitoExtension.class)
public class 테스트클래스 {

	//메서드 매개변수
	@Test
	void 테스트메서드(@Mock Mock객체로_만들_인터페이스 mock) {
		//테스트코드
	}

}
  • 이것도 마찬가지로, @ExtendWith(MockitoExtension.class) 로 Mockito 확장모델을 적용해야 @Mock 을 사용할 수 있다.


사용 예시

import static org.mockito.Mockito.*;
//나머지 import 생략

class StudyServiceTest {

  /**
   * @Mock 애너테이션으로 mock 객체 만들기
   */
  @Test
  void createStudyServiceWithAnnotaion(@Mock MemberService memberServiceWithAnno,
					@Mock StudyRepository studyRepositoryWithAnno
									) {

    /*
     StudyService 생성자의 인수로
     'MemberService'객체와, 'StudyRepository' 객체를 넣어야하지만
     현재 인터페이스만 존재하는 상황이다.
     따라서, mock 객체를 통해 StudyService 객체를 생성할 수 있다.
     */
	//Mock 객체로 의존성이 주입되었다.
    StudyService studyService = new StudyService(memberServiceWithAnno, studyRepositoryWithAnno);
    assertNotNull(studyService);
	}

}




  • 본 게시글은 백기선님의 강의를 토대로 정리한 글입니다.
  • 더 자세한 내용을 알고 싶으신 분들이 계신다면, 해당 강의를 수강하시는 것을 추천드립니다.