Mockito

NNIIE·2022년 6월 10일
0

Test

목록 보기
2/3
post-thumbnail

Mockito

Spring 웹 애플리케이션을 개발하다 보면, 필연적으로 여러 객체들 간의 의존성이 생기기 마련이다.
이런 의존성들은 단위 테스트 작성을 어렵게 한다. 이를 해결하기 위한 가짜 객체를 주입시켜주는 Mockito 라이브러리가 있다.

  • Mock: 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체.
  • Mockito: Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다.

시작

  1. 기본적으로 2.2+ Springboot 사용시 spring-boot-starter-test에서 자동으로 Mockito 추가
  2. 의존성 직접 추가
    <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>3.1.0</version>
       <scope>test</scope>
    </dependency>
    <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-junit-jupiter</artifactId>
       <version>3.1.0</version>
       <scope>test</scope>
    </dependency>

객체 생성

  • Mockito.mock() 메소드로 만드는 방법
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);
  • @Mock 애노테이션으로 만드는 방법

    • JUnit 5 extension으로 MockitoExtension을 사용
      @ExtendWith(MockitoExtension.class)
  • 필드

    @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);
       }
    }

Stubbing

모든 Mock 객체의 행동

  • Null을 리턴한다. (Optional 타입은 Optional.empty 리턴)
  • Primitive 타입은 기본 Primitive 값.
  • 콜렉션은 비어있는 콜렉션.
  • Void 메소드는 예외를 던지지 않고 아무런 일도 발생하지 않는다.

Mock 객체를 조작해서

  • 특정한 매개변수를 받은 경우 특정한 값을 리턴하거나 예뢰를 던지도록 만들 수 있다.
  • Void 메소드 특정 매개변수를 받거나 호출된 경우 예외를 발생 시킬 수 있다.
  • 메소드가 동일한 매개변수로 여러번 호출될 때 각기 다르게 행동하도록 조작할 수도 있다.
// memberService 객체에 findById 메소드를 1L 값으로 호출하면 Optional.of(member) 객체를 리턴하도록 Stubbing
when(memberService.findById(1L)).thenReturn(member);

// studyRepository 객체에 save 메소드를 study 객체로 호출하면 study 객체 그대로 리턴하도록 Stubbing
when(studyRepository.save(study)).thenReturn(study);

BDD Style

BDD : 애플리케이션이 어떻게 “행동”해야 하는지에 대한 공통된 이해를 구성하는 방법으로, TDD에서 창안

행동에 대한 스펙

  • Title
  • Narrative
    • As a / I want / so that
  • Acceptance criteria
    • Given / When / Then

Mockito는 BddMockito 클래스를 통해 BDD 스타일의 API도 제공한다.

// When -> Given
given(memberService.findById(1L)).willReturn(member);
given(studyRepository.save(study)).willReturn(study);

0개의 댓글