6/5 Mockito

박세현·2024년 6월 5일
0

3차 프로젝트

목록 보기
10/14
post-thumbnail

Mockito 기초 사용법

  • Mockito는 모의 객체 생성, 검증, 스텁을 지원하는 프레임워크
  • 스텁(stub) : 가짜 데이터

  • 쓰는이유
    -> 현장에서 백엔드와 프론트엔드가 나누어 개발
    -> 백엔드 기능이 없는데 백엔드 쪽이 기능 개발하는데 한달 걸림
    -> 프론트엔드 쪽이 그렇다고 한달 기다렸다가 이어서 개발하기엔 좀...
    -> 가짜데이터 만들어서 개발하자

참고) servlet.api

  • javax.servlet-api / java ee8, javax
  • jakarta.servlet-api / jakarta ee9~10
    -> compileOnly 'jakarta.servlet:jakarta.servlet-api:6.0.0'

HttpServletRequest 인터페이스 : 사용자 요청 데이터 조회, 처리

  • String getParameter()


1. 의존성

  • mockito-core
    -> testImplementation 'org.mockito:mockito-core:5.12.0'
  • mockito-junit-jupiter
    -> testImplementation 'org.mockito:mockito-junit-jupiter:5.12.0'



2. 모의 객체 생성

  • Mockito.mock() 메서드를 이용하면 특정 타입의 모의 객체를 생성할 수 있다.



3. 스텁 설정

  • 모의 객체를 생성한 뒤에는 BDDMockito 클래스를 이용해서 모의 객체에 스텀을 구성할 수 있다.

  • BDDMockito.given() 메서드를 이용하면 모의 객체의 메서드가 특정 값을 리턴하도록 설정할 수 있다.

  • given() 메서드에 이어 willReturn() 메서드는 스텁을 정의한 메서드가 리턴할 값을 지정한다.

    • 모의 객체 생성
      GameNumGen genMock = mock(GameNumGen.class);
      -> mock(클래스클래스)

    • 스텁 설정
      given(genMock.generate(GameLevel.EASY)).willReturn("123");
      -> given(특정 메서드에 매개변수가 들어오면).willReturn(이러한 값을 반환하겠다)

    • 스텁 설정에 매칭되는 메서드 실행
      String num = genMock.generate(GameLevel.EASY);

  • 지정한 값을 리턴하는 대신에 익셉션을 발생하게 설정할 수 도 있다. 이때는 willReturn() 대신 willThrow() 메서드를 사용하면 된다.

  • BDDMockito.willThrow() 메서드는 발생할 익셉션 타입이나 익셉션 객체를 인자로 받는다. 이어서 given() 메서드는 모의 객체를 전달받는다. 이때는 모의 객체 메서드의 실행이 아닌 모의 객체를 만들어 주는 것 이때 given() 메서드는 인자로 전달받은 모의 객체 자신을 리턴하는데 이때 익셉션을 발생할 메서드를 호출한다.

참고) 가짜 데이터 생성 라이브러리

  • 의존성 : java faker
    -> implementation 'com.github.javafaker:javafaker:1.0.2'

예시) 스텁



예시) 가짜 데이터 생성 라이브러리_java faker

ㄴ 무작위 한국 이름

ㄴ 무작위 일본 이름

ㄴ 무작위 주소




4. 인자 매칭 처리

  • org.mockito.ArgumentMatchers 클래스를 사용하면 정확하게 일치하는 값 대신 임의의 값에 일치하도록 설정할 수 있다.
  • ArgumentMatchers 클래스는 다음의 메서드를 제공
    • anyInt(), anyShort(), anyLong(), anyByte(), anyChar(), anyDouble(), anyFloat(), anyBoolean() : 기본 데이터 타입에 대한 임의 값 일치
    • anyString() : 문자열에 대한 임의 값 일치
    • any() : 임의 타입에 대한 일치
    • anyList(), anySet(), anyMap(), anyCollection() : 임의 콜렉션에 대한 일치
    • matches(String), matches(Pattern): 정규표현식을 이용한 String 값 일치 여부
    • eq(값) : 특정 값과 일치 여부



5. 행위 검증

  • 실제로 모의 객체가 불렸는지 검증하는 것
  • 예시
GameNumGen genMock = mock(GameNumGen.class);
Game game = new Game(genMock);
game.init(GameLevel.EASY);

then(genMock).should().generate(GameLevel.EASY);
  • BDDMockito.then()은 메서드 호출 여부를 검증할 모의 객체를 전달받는다.

  • should() 메서드는 모의 객체의 메서드가 불려야 한다는 것을 설정하고 should() 메서드 다음에 실제로 불려야 할 메서드를 지정한다.

  • 이 코드에서 genMock 모의 객체의 generate() 메서드가 GameLevel.EASY 인자를 사용해서 호출되었는지 검증한다.

  • 정확한 값이 아니라 메서드가 불렸는지 여부가 중요하다면 any(), anyInt() 등을 사용해서 인자를 지정하면 된다.

    • then(genMock).should().generate(any());
  • 정확하게 한 번만 호출된 것을 검증하고 싶다면 should() 메서드에 Mockito.only()를 인자로 전달한다

    • then(genMock).should(only()).generate(any());
  • 메서드 호출 횟수를 검증하기 위해 Mockito 클래스가 제공하는 메서드는 다음과 같다.

    • only() : 한 번만 호출
    • times(int) : 지정한 횟수만큼 호출
    • never() : 호출하지 않음
    • atLeast(int) : 적어도 지정한 횟수만큼 호출
    • atLeastOnce() : atLeast(1)과 동일
    • atMost(int) : 최대 지정한 횟수만큼 호출



6. 인자 캡쳐

  • 단위 테스트를 실행하다보면 모의 객체를 호출할 때 사용한 인자를 검증해야 할 때가 있다. String이나 int와 같은 타입은 쉽게 검증할 수 있지만 많은 속성을 가진 객체는 쉽게 검증하기 어렵다. 이럴 때 사용할 수 있는 것이 인자 캡처이다.

  • Mockito의 ArgumentCaptor를 사용하면 메서드 호출 여부를 검증하는 과정에서 실제 호출할 때 전달한 인자를 보관할 수 있다.


예시)




7. JUnit 5 확장 설정

profile
귤귤

0개의 댓글

관련 채용 정보