2009-08-02 3 views
6

jUnit 4.5 테스트에서 현재 시간을 조작 할 수있는 방법이 있습니까? 내가 쉽게 테스트 할 수 있도록 내가단위 테스트에서 현재 시간을 조작 하시겠습니까?

public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

한 가지 방법에 대한 단위 테스트를하고 싶습니다 다음과 같은 방법을 두 가지 방법

나를을 테스트 할 수 있습니다
public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    return getLastWeekFor(c); 
} 

public String getLastWeekFor(GregorianCalander c) { 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

으로 분할하는 것입니다 week 빼기 로직을 ​​사용하지만, getLastWeek는 테스트되지 않은 상태로 남겨 두었고,이를 위해 한 가지 방법을 선호합니다.

+0

두 가지 다른 매개 변수 목록을 사용하는 것만으로도 하나의 방법 일뿐입니다. – guerda

답변

6

시스템 시간을 조정할 실제 방법이 없습니다.

사실, 당신은 테스트 할 수있게하기 위해서 그 방법을 꽤 정교하게 리팩토했습니다. 나는 그것을 계속 지킬 것이다.

3

여기서 두 경로를 볼 수 있습니다.

CalendarDate 인스턴스의 구성을 캡슐화하는 DateUtils 팩토리 클래스를 만듭니다. 그런 다음 이것을 제어 가능한 공장으로 바꿀 수 있습니다. 예를 들어 setCurrentTime 메서드를 노출하는 DateUtils의 두 번째 구현이 있으며 명시 적으로 해당 날짜로 설정된 Calendar 인스턴스를 반환합니다.

또는 실제로 JMockit을 사용하여 new GregorianCalendar이라는 호출을 실제로 "재정의"할 수 있으므로 mock 인스턴스가 반환됩니다. 나는 이것을 직접하지는 않았지만, 설명은 here입니다.

방법을 두 가지 방법으로 분리하는 옵션은 완전히 유효한 옵션입니다. 나는 그것이 대부분의 사람들이하는 일이라고 생각한다. - 나 자신을 포함하지만, 진실은 당신의 디자인에 해를 끼친다는 것이다. 특히 클래스가 다른 코드에 노출되어 있다면 더욱 그렇다.

+0

처음 두 가지 제안은 완벽하게 유효하고 다른 상황에서도 많이 사용되는 반면 OP의 필요에 과도한 비방을 느낍니다. –

1

무엇을 다시 만들려고하는 것처럼 보입니다. JODA 시간 않습니다. 네가 알지 못하는 경우를 대비해서 내가 인용 할게. 휠 재발견과 종속성 추가 사이에 절충점을 만들 수 있습니다.

+0

Actully 나는 JODA를 오늘 일찍 발견했고, 그것이 내가 충분히 actully 사용하고 싶었던 것을 깨달았다. 테스트 할 수있는 JODA 버전은 어떻게 보입니까? 아니면 JODA가 자체 테스트를해야하므로 정확하게 작동한다고 가정해야합니까? –

+0

JODA 소스를 점검하고 단위 테스트를 받았는지 확인하십시오. 나는 그것이 틀림 없음을 내기하고있다. 일반적으로 제 3 자 라이브러리는 다른 것으로 믿을만한 이유가 될 때까지 테스트를 거쳤습니다. 최악의 경우 사용자 기반이 사용자보다 많습니다. 많은 사람들이 코드를 두드리는 것은 많은 오류를 찾아서 수정하는 좋은 방법입니다. – duffymo

관련 문제