ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • 가상 스레드 예외 핸들링
  • tree
  • 구조화된 동시성
  • nGrinder
  • mysql
  • querydsl
  • junit5
  • DataJpaTest
  • AuthenticationException
  • AccessDecisionManager
  • nginx basic auth
  • java
  • 동등성
  • restdocs enum
  • FilterSecurityInterceptor
  • UserDetailsService
  • 인가(Authorization) 처리
  • node exporter basic auth
  • 트랜잭션
  • VirtualThread Springboot
  • StructuredConcorrency
  • 동일성
  • 정규표현식
  • AccessDecisionVoter 커스텀
  • 동시성 제어
  • scope value
  • jpa
  • restdocs custom
  • LocalDateTime
  • 가상 스레드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

테스트/JUnit

JUnit5 - Java에서의 단위테스트4 Mock, Mockito

2022. 8. 21. 21:52

Mockito란?

Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜(Mock) 객체를 지원하는 테스트 프레임워크.

Mock: 진짜 객체와 비슷하게 동작하지만 그동작을 직접 그 객체의 행동을 관리하는 객체.

Mockito: Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다. 테스트를 작성하는 자바 개발자 50%+ 사용하는 Mock 프레임워크.

단위 테스트에 고찰

  • 참조 : https://martinfowler.com/bliki/UnitTest.html

Mock Object를 만들어 주입시켜주는 방법을 지원해주는 라이브러리이다.

Mockito는 과거에는 static메서드를 지원하지 않는 단점이 있어 PowerMock을 대안으로 사용했으나 Mockito 3.4.0부터는 static method도 지원한다.

Mockito 시작하기

라이브러리 :

  • org.mockto:mockto-core
  • org.mokito:mockto-junit-jupiter

다음 세 가지만 알면 Mock을 활용한 테스트를 쉽게 작성할 수 있다.

  • Mock을 만드는 방법
  • Mock이 어떻게 동작해야 하는지 관리하는 방법
  • Mock의 행동을 검증하는 방법

Mockito 레퍼런스

  • https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html

Mockito사용법

Mock 객체 만들기

Mockito에서 Mock object에 의존성을 주입하기 위해서는 크게 3가지의 어노테이션을 사용.

  • @Mock : Mock 객체를 만들어 반환해주는 어노테이션
    • Mockto.mock() 메서드로도 생성이 가능하다.
  • @Spy: Stub하지 않은 메소드들을 원본 메소드 그대로 사용하는 어노테이션
  • @InjectMocks: @Mock 또는 @Spy로 생성된 가짜 객체를 자동으로 주입시켜주는 어노테이션

mock을 쓰기에 아주 적절한 경우

  • 구현체는 없지만 interface만 알고있어서 interface를 이용해서 코드를 작성하는 경우.

@Mock을 사용하지 않고 mock()메서드를 통해서도 mock객체를 만들 수 있다.
example)

Hint hint = mock(Hint.class);

구현체는 없고 구현하지 않아도 가짜로 객체를 만드는법 2가지

  1. Mocito.mock() 메서드로 객체 생성
  2. @Mock 어노테이션으로 객체 생성

1. Mockito.mock() 메서드로 mock 객체를 만드는법

MemberService memberService = Mockito.mock(MemberService.class);
StudyRepository studyRepository = Mockito.mock(StudyRepository.class);
  • MemberSerivce와 StudyRepository는 구현체가 없는 interface이다.
  • 구현체가 없고 구현하지 않았음에도 불구하고 mock으로 만들어준다.

2. @Mock 어노테이션으로 만드는 방법

  • 반드시 @ExtendWith 어노테이션이 있어야 작동!
  • JUnit 5 extension으로 MockitoExtension을 사용해야 한다.( 클래스 선언 위에)
  • 필드와 메서드 매개변수로 만들 수 있다

  • 필드로 만들기
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {

  @Mock MemberService memberService;
  @Mock StudyRepository studyRepository;
  ...
}
  • 메서드 매개변수로 만들기
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
    @Test
    void createStudyService(@Mock MemberService memberService,
                            @Mock StudyRepository studyRepository) {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);
      }
}

참고

  • 인프런 백기선님 강의 더 자바, 애플리케이션을 테스트하는 다양한 방법
  • https://velog.io/@seongwon97/Unit-Test-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8

'테스트 > JUnit' 카테고리의 다른 글

Spring Boot JPA Test @DataJpaTest 기본 설정  (3) 2022.08.27
JUnit5 - Java에서의 단위테스트5 Mock, Mockito, Stup  (0) 2022.08.21
JUnit5 - Java에서의 단위테스트3 - 테스트 인스턴스들  (0) 2022.08.21
JUnit5 - Java에서의 단위테스트2 - 테스트 반복  (0) 2022.08.21
JUnit5 - Java에서의 단위테스트 1  (0) 2022.08.21
    '테스트/JUnit' 카테고리의 다른 글
    • Spring Boot JPA Test @DataJpaTest 기본 설정
    • JUnit5 - Java에서의 단위테스트5 Mock, Mockito, Stup
    • JUnit5 - Java에서의 단위테스트3 - 테스트 인스턴스들
    • JUnit5 - Java에서의 단위테스트2 - 테스트 반복
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바