如果將所有時間相關的任務抽象爲一個類,則可以將其繼承爲測試類,其中所有系統時間乘以某個常量,並且所有用戶時間除以某個常量。直接調用任何時間依賴的方法,而不是直接調用它通過這個類。
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