这就是我正在使用的。我在书中找到它:测试驱动 - 用于Java开发人员的实用TDD和验收TDD由Lasse Koskela。
public interface TimeSource {
long millis();
}
public class SystemTime {
private static TimeSource source = null;
private static final TimeSource DEFAULTSRC =
new TimeSource() {
public long millis() {
return System.currentTimeMillis();
}
};
private static TimeSource getTimeSource() {
TimeSource answer;
if (source == null) {
answer = DEFAULTSRC;
} else {
answer = source;
}
return answer;
}
public static void setTimeSource(final TimeSource timeSource) {
SystemTime.source = timeSource;
}
public static void reset() {
setTimeSource(null);
}
public static long asMillis() {
return getTimeSource().millis();
}
public static Date asDate() {
return new Date(asMillis());
}
}
请注意,默认时间源DEFAULTSRC是System.currentTimeMillis()。它在单元测试中被替换;然而,正常行为是标准的系统时间。
这是它被用于:
public class SimHengstler {
private long lastTime = 0;
public SimHengstler() {
lastTime = SystemTime.asMillis(); //System.currentTimeMillis();
}
}
,这里是单元测试:
import com.company.timing.SystemTime;
import com.company.timing.TimeSource;
public class SimHengstlerTest {
@After
public void tearDown() {
SystemTime.reset();
}
@Test
public final void testComputeAccel() {
// Setup
setStartTime();
SimHengstler instance = new SimHengstler();
setEndTime(1020L);
}
private void setStartTime() {
final long fakeStartTime = 1000L;
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeStartTime;
}
});
}
private void setEndTime(final long t) {
final long fakeEndTime = t; // 20 millisecond time difference
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeEndTime;
}
});
}
在单元测试中,我更换了TIMESOURCE只有这为1000多家毫秒。这将作为开始时间。当调用setEndTime()时,我输入1020毫秒的结束时间。这给了我一个20毫秒的时间差。
生产代码中没有测试代码,只是得到正常的系统时间。
确保在测试后调用重置以恢复使用系统时间方法而不是假时间。
是的,某种双重调度(我认为?)将是理想的方法,太糟糕的.NET使得这样做很麻烦。我有时会推出自己的定时器界面,但总是觉得我正在引入复杂性。 – 2009-05-18 21:52:57