如果将所有时间相关的任务抽象为一个类,则可以将其继承为测试类,其中所有系统时间乘以某个常量,并且所有用户时间除以某个常量。直接调用任何时间依赖的方法,而不是直接调用它通过这个类。
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