Mock으로 test해보기(feat.Mockito)

문지은·2021년 9월 13일
0

TDD

목록 보기
2/2

단위 테스트할 때 의존성을 가지는 객체들에 대해서 실제로 프로그램을 올리는 대신 Mock을 이용해서 올린다!

ex. DB에서 정보 꺼내온 뒤 가공하는 서비스 코드 테스트 하고 싶을 때 : DB에서 정보 꺼내오는 건 Mock을 이용해서 처리!

Mock 중에서도 다양한 프레임워크가 존재한다. 그 중에서도 내가 사용해 볼 것은 Mockito

@Mock, @InjectMocks 를 이용해서 service, mapper, util 등을 주입시켜서 사용한다.

  • @Mock : Mock 객체를 생성한다.

  • @InjectMocks : @Mock 객체를 @InjectMocks 객체에 주입시킬 수 있다. 자신의 멤버 클래스와 일치할 때만!

Mock -------주입---------> InjectMocks

    @InjectMocks
    private UserService userService;

    @Mock
    private UserMapper userMapper;		//userService를 주입받는다.
    
    @Mock
    private UserRoleMapper userRoleMapper;		//userService를 주입받는다.

    @Mock
    private PasswordEncoder passwordEncoder;		//userService를 주입받는다.

이제 주입한 Mock 객체를 활용해서 여러가지 테스트를 진행해보자!

실행 여부

//addUser가 한번만 실행됐는지 확인
verify(userMapper, times(1)).addUser(any());

//addUserRole이 한번만 실행됐는지 확인
verify(userRoleMapper, times(1)).addUserRole(any());

//passwordEncoder가 한번만 실행됐는지 확인
verify(passwordEncoder, times(1)).encode(anyString());


//any(), anyString()으로 아무 변수 들어갔을 때를 가정으로 함

예외 던지기

//username 중복 exception 던지기
doThrow(new DuplicateKeyException("username 중복 exception")).when(userMapper).addUser(any());

//signUp 실행했을 때 해당 예외 일어났는지 확인하기
assertThrows(NewbieException.class, () -> userService.signUp(request));

//실행 여부 확인하기
verify(userMapper, times(1)).addUser(any());
verify(userRoleMapper, times(0)).addUserRole(any());
profile
백엔드 개발자입니다.

0개의 댓글