모든 시간 종속 작업을 단일 클래스로 추상화하면 모든 시스템 시간에 상수가 곱해지고 모든 사용자 시간이 상수로 나뉘어지는 테스트 클래스로 상속 할 수 있습니다. 시간 종속적 인 메소드를 직접 호출하는 대신이 클래스를 호출합니다.
class TimeHandler {
protected Context context;
public TimeHandler(Context context) {
mContext = context;
}
public long toSystemMillis(long userMillis) {
return userMillis;
}
public long toUserMillis(long systemMillis) {
return systemMillis;
}
public long toSystemDelay(long userDelay) {
return userDelay;
}
public long toUserDelay(long systemDelay) {
return systemDelay;
}
public void setAlarmAt(long userMillis, PendingIntent operation) {
long systemMillis = toSystemMillis(userMillis);
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, systemMillis, operation);
}
public void setAlarmAfter(long userDelay, PendingIntent operation) {
long systemDelay = toSystemDelay(userDelay);
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, systemDelay, operation);
}
} // (scroll down)
class OptimizedTimeHandler extends TimeHandler {
protected static final long RATE = 60; // 1 minute -> 1 hour
protected static final long START_TIME = Date.UTC(2011,9,18,0,0,0);
public TestTimeHandler(Context context) {
super(context);
}
@Override
public long toSystemMillis(long userMillis) {
return START_TIME + (userMillis - START_TIME)/RATE;
}
@Override
public long toUserMillis(long systemMillis) {
return START_TIME + (userMillis - START_TIME)*RATE;
}
@Override
public long toSystemDelay(long userDelay) {
return userDelay/RATE;
}
@Override
public long toUserDelay(long systemDelay) {
return systemDelay*RATE;
}
}
UPDATE는
당신은 인스턴스 필드에 RATE
및 START_TIME
상수를 만들 수 있습니다. 어쩌면 생성자 인수.
사용 예제 :
TimeHandler th = new TimeHandler();
th.setAlarmAt(Date.UTC(2011,9,19,0,0,0), operation);
// will fire at 2011-09-19 00:00:00 (real time)
th = new OptimizedTimeHandler();
th.setAlarmAt(Date.UTC(2011,9,19,0,0,0), operation);
// will fire at 2011-09-18 00:24:00 (real time)
당신은 알람의 실제 스케줄링을 제어 할 수없는 경우에, 나는 시간을 압축 할 수있는 방법이라고 생각하지 않습니다. 알람을 데이터베이스에서 읽을 때 이러한 클래스를 사용하여 알람을 예약해야합니다.
알람을 서로 몇 초 내에 예약 할 수없는 이유는 무엇입니까? – user432209
그렇다면 디버그 로직 세트와 실제 로직 세트가 있어야합니다. 이러한 접근 방식은 작은 세트에서 작동하는데, 스케줄링에 관한 한 내가 혼란스럽지 않도록하고 싶습니다. 그러나 실제 행동을 테스트 할 때는 가능하다면이를 피하고 싶습니다. 또 다른 이유는 다른 요일 (주중과 주말을 생각할 때)마다 다른 행동을 원한다는 것입니다. FORCE_IS_WEEKEND와 같은 상수로 게임하는 대신 작성한 논리를 테스트하고 싶습니다. – Travis
또 다른 이유는 - 나는 "자정에"발사해야 할 나의 경보가 작동한다는 것을 (시간의 빠른 흐름을 시뮬레이션 함으로서) 시험 할 수 있기를 원합니다. – Travis