JCommon 라이브러리를 보면 org.jfree.date라는 패키지가 있으며 여기에 SerialDate라는 클래스가 있다.
SerialDate : 날짜를 표현하는 클래스.
→ java.util.Date, java.util.Calendar가 있지만 사용하지 않는 이유는 "너무" 정밀하기 때문(1000분의 1초의 정밀도로 시간 표현)
∴ 하루 중 시각, 시간대에 무관하게 특정 날짜만을 표현하기 위한 클래스 ex) 2015년 1월 21일
⇒ SerialDate = 순수 날짜 클래스 ↔ java.util.Date, java.util.Calendar = 시간 기반 날짜 클래스
SerialDateTests라는 클래스는 단위 테스트 케이스를 몇 개 포함.(소스 코드는 책 473쪽 목록 B-2 참조)
돌려보면 실패하는 경우는 없지만 모든 경우를 테스트 하지 않는다.
단위 커버리지 분석 도구인 클로버를 이용해서 단위 테스트가 실행하는 코드와 실행하지 않는 코드를 조사하니 50%만이 실행됨.
더 높은 테스트 커버리지를 위해 독자적으로 단위테그트 케이스 구현
stringToWeekdayCode라는 메서드 → 만든 이유를 모르겠지만 대소문자 구분없이 통과하도록 454쪽 259행, 263행의 equals를 equalsIgnoreCase로 수정
484쪽 32행과 45행은 'tues'와 'thurs'라는 약어를 지원해야할지 분명치 않아서 주석으로 남겼었는데, stringToMonth 수정
if ((result < 1) || result > 12) {
result = -1;
for (int i = 0; i < maonthNames.length; i++) {
if (s.equalsIgnoreCase(shortMonthNames[i])) {
result = i + 1;
break;
}
if (s.equalsIgnoreCase(monthNames[i])) {
result = i + 1;
break;
}
}
}
한 번 손 본 getFollowingDayOfWeek 메서드의 경계 오류로 인한 버그를 아래와 같이 수정
// before
if (baseDOW > targetWeekday) {
// after
if (baseDow >= targetWeekday) {
705행 getNearestDayOfWeek 메서드를 테스트 하는 (329행) testGetNearestDayOfWeek 단위 테스트 메서드는 처음부터 이렇게 길지 않았지만 실패하는 바람에 계속 추가하게 되었다.
주석으로 처리된 코드를 살펴보면 경계 조건 오류로 인해 실패하는 패턴이 보인다.
719행은 실행되지 않으므로 아래와 같이 수정한다.
int delta = targetDOW = base.getDayOfWeek();
int positiveDelta = delta + 7;
int adjust = positiveDelta % 7;
if (adjust > 3)
adjust -= 7;
return SerialDate.addDays(adjust, base);
BobsSerialDateTest.java의 417행과 429행은 weekInMonthToString과 relativeToString에서 오류 문자열을 반환하는 대신 IllegalArgumentException을 던져 테스트를 통과시킴.
⇒ 이제 SerialDate는 모든 테스트 케이스를 통과함. 이제 SerialDate 코드를 수정하자.
코드 수정 시 JCommon의 단우 테스트와 저자의 단위 테스트를 실행함.