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

21 Jun 2017 JUnit, mockito

단위테스트의 목적

  • 테스트 안전장치(Harness)로써, 소프트웨어를 안전하게 보호
  • 소스코드 변경으로 인해 기존 SW가 깨지면 테스트 안전장치도 깨진 상태가 됨
  • 다시 안전한 상태가 되도록 테스트 코드를 변경
  • 변경한 테스트 코드를 기반으로 이전에 수행했던 테스트를 다시 수행 (회귀테스트)

단위테스트목적

단위테스트의 상호작용

  • SUT는 테스트 대상시스템, DOC는 테스트 대상시스템에서 의존하는 컴포넌트
  • 단위 테스트를 진행할 때 테스트 대상 모듈이 의존하는 다른 컴포넌트에 대한 환경을 고려하여 테스트를 진행
  • 테스트 대상이 의존하는 모듈의 환경 문제로 단위 테스트 작성 시 테스트 더블1로 테스트 케이스를 작성

상호작용

테스트의 아키텍처

  • 의존성 주입(Dependency Injection)을 통해 의존관계를 형성
  • 느슨한 의존관계를 통한 테스트 용이성2을 확보

아키텍처

의존성 주입

  • 의존성 주입은 방식에 따라 Parameter, Constructor, Setter 주입 등으로 나눔
  • 컴포넌트가 주입 받은 객체에 대한 참조를 객체 내에 유지
  • 의존성 주입 프레임워크를 사용하면 Field 주입 가능
//의존관계를 갖는 객체를 파라미터로 전달 예제

/*
  날짜값 처리 유틸리티
*/
//SUT 코드
public class DateHandler{
  /*
  * 현재시간을 (yyyy-MM-dd)로 조회
  * @param provider
  * @return
  */
  public static String getCurrentTime(TimeProvider timeProvider) throws Exception {
    Calendar c = null;
    c = timeProvider.getTime();

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    return sdf.format(c.getTime());
  }
}

//특정시간을 제공하는 DOC과 연결, 인터페이스를 통해 DI(의존성주입)
public Interface TimeProvider{
  /*
  * 특정시간을 제공
  * @return 특정 시간
  * @throws Exception
  */
  Calendar getTime() throws Exception;
}

//테스트 코드
public class DateHandlerTest {

  @Test
  public void testGetCurrentTime() throws Exception{
    String currentTime = DateHandler.getCurrentTime(new TimeProvider(){

      public Calendar getTime() throws Exception{
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, 2014);
        c.set(Calendar.MONTH, Calendar.JANUARY);
        c.set(Calendar.DAY_OF_MONTH, 1);
        return c;
      }
    });
    assertEquals("2014-01-01", currentTime);
  }
}
  1. 테스트 더블이란 테스트시에 실제 객체를 대신 할 수 있는 객체를 의미 (Stub, Mock, Fake Object…) 

  2. 인터페이스(Interface)를 통한 주입으로 DOC와의 연결을 소스변경없이 runtime환경에서도 실행, 테스트 환경에서도 실행가능… 즉 SUT의 변경없이 테스트 가능