jUnit과 Mockito를 이용한 단위테스트 기초 4일차

22 Jun 2017 JUnit, mockito

Test Double

  • 테스트 대상 컴포넌트(SUT)가 의존하는 컴포넌트(DOC)를 테스트 환경에 맞는 컴포넌트로 대체하는 것
  • 테스트 더블은 테스트 환경 내에서 의존 컴포넌트와 동일하게 동작하도록 구성
  • 테스트 시점에는 테스트 더블을 생성해서 SUT에 주입

테스트더블

Mock Object

  • Mock 객체를 사용해서 해당 오퍼레이션에 대한 입출력을 간접적으로 검증함으로써, 테스트 대상의 내부 행위를 검증
  • Mock 객체를 사용하지 않을 경우 단위 테스트에서 의존관계를 맺는 컴포넌트를 생성하여야 하며, 이는 또 다른 테스트 환 경이 마련되어야 함을 의미
  • 즉, 의존 관계가 깊어질수록 많은 테스트 환경이 필요한데, Mock 객체는 이러한 수고를 덜어줌

MockObject

Mockito 개요

  • 자바 단위테스트에서 가짜 객체를 지원해주는 프레임워크
  • Mockito는 Szczepan Faber and friends에 의해 서비스가 제공
  • Mock 객체 생성, Mock 객체 동작을 지정, 그리고 테스트 대상 로직이 제대로 수행 되었는지 확인

mock 객체 생성

  • mock 메소드를 사용하여 mock객체를 생성
  • mock객체를 Constructor, Setter Parameter Injection 중 한가지 방식을 통해 주입
@Test
public void findProjectListByMock(){
  //가상객체(mock객체)를 생성
  ProjectEntity mock = mock(ProjectEntity.class);
  //가상객체를 주입
  userProcess.setProjectEntity(mock);
}

stub1 만들기

  • When 메소드를 통해 하나의 메소드가 호출되었을 때 임의 값을 반환 하라고 설정
  • 메소드의 파라미터 값까지 지정하고, 호출 시점에서 지정한 파라미터까지 동일해야 지정한 임의 값을 반환
@Test
public void findProjectListByMock() {
  //1. 가상객체(목객체)를 생성
  ProjectEntity mock = mock(ProjectEntity.class);
  userProcess.setProjectEntity(mock);
  //2. 결과값(예상값)을 녹화
  List<String> projects = new ArrayList<>(); //가짜 객체에서 반환 할 값 생성
  projects.add("정보원 프로젝트");
  projects.add("직능원 프로젝트");
  projects.add("인천공항 프로젝트");

  when(mock.findProjectList("hjkwon")).thenReturn(projects); //가짜 객체에서 frndProjectList메소드의 파라미터로 ‘hjkwon’이 호출되면 위에저 지정한 값을 반환 하라고 설정
  List<String> projectList = userProcess.findProjectList("hjkwon"); //Stub으로 지정 한 값 리턴 받음

  assertNotNull(projectList);
  assertEquals(3, projectList.size());

  verify(mock, times(1)).findProjectList("hjkwon");
}

mock 객체 검증

  • verify 메소드를 통해 실제 로직 상에서 mock 객체의 메소드가 호출되었는지 확인하고 검증

Mockito 메소드 종류

  • Mock() - 모의 객체를 생성하는 역할
  • when() - 협력객체 메소드 반환 값을 지정해주는 역할(stub)
  • verify() - SUT안의 협력객체 메소드가 호출 되었는지 확인
  • times() - 지정한 횟수 만큼 협력 객체 메소드가 호출 되었는지 확인
  • nerver() - 호출되지 않았는지 여부 검증
  • atLeastOnce() - 최소 한 번은 특정 메소드가 호출되었는지 확인
  • atLeast() - 최소 지정한 횟수 만큼 호출되었는지 확인
  • atMost() - 최대 지정한 횟수 만큼 호출되었는지 확인
  • clear() - 스텁을 초기화 한다
  • timeOut() - 지정된 시간 안에 호출되었는지 확인
  1. 테스트를 위한 로직