DateMessageProvider 코드에 대한 세번째 해결 방법

2013-01-14 10:33

세번째 방법은 http://www.slipp.net/questions/50#answer-240 답변에서 이미 이야기한 내용이다. 앞의 두 가지 방법은 DateMessageProvider가 Calendar 인스턴스를 직접 생성하는 것에서 문제의 해결책을 찾으려고 했다.

하지만 소스 코드와 요구사항을 잘 보면 반드시 Calendar 인스턴스에 의존해서 테스트 코드를 만들 필요가 없다. 단순히 현재 시간만 알고 있다면 이 시간을 메소드 인자로 전달해 다음과 같이 테스트 코드를 만들 수 있다.

먼저 DateMessageProvider에서 시간을 기준으로 오전, 오후 메시지를 출력하는 메소드를 extract method로 리팩토링한다.

package net.slipp;


import java.util.Calendar;
   
public class DateMessageProvider { 
  public String getDateMessage() {
    Calendar now = Calendar.getInstance();
    int hour = now.get(Calendar.HOUR_OF_DAY);
    return getHourMessage(hour);
  }
  
  String getHourMessage(int hour) {
    if (hour < 12) {
      return "오전";
    }
      
    return "오후";
  }
}

위와 같이 리팩토링을 한 후 getDateMessage()에 대한 단위 테스트를 하는 것이 아니라 getHourMessage()에 대한 단위 테스트를 하면 된다.

package net.slipp;
   
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
   
import org.junit.Test;
   
public class DateMessageProviderTest {
  @Test
  public void 오전() throws Exception {
    DateMessageProvider provider = new DateMessageProvider();
    assertThat( provider.getHourMessage(11), is("오전"));
  }
     
  @Test
  public void 오후() throws Exception {
    DateMessageProvider provider = new DateMessageProvider();
    assertThat( provider.getHourMessage(16), is("오후"));
  }
}

위와 같이 단위 테스트를 하면 단위 테스트 코드에서 Calendar 인스턴스를 생성해 시간을 변경할 필요도 없기 때문에 훨씬 더 쉽게 단위 테스트를 할 수 있다는 장점이 있다.

그런데 위 코드를 보면 한 가지 이슈가 있다. getHourMessage() 메소드의 경우 getDateMessage()에서만 사용한다면 private으로 선언해도 된다. 그런데 단위 테스트를 위해 private에서 default로 변경했다. 이와 같이 private method로 구현해도 되는데 단위 테스트를 위해 default로 변경해야 하는 것이 무엇인가 기분이 찜찜하다.

이 이슈와 관련하여 lark님은 http://www.slipp.net/questions/50#answer-243 답변에서 본인의 의견을 제시하고 있다. 다음 글에서는 이와 관련해 다시 한번 이야기한 후 최초 글에 대한 마무리를 해볼까 한다.

0개의 의견 from SLiPP

의견 추가하기

연관태그

← 목록으로