Đây là những gì tôi đang sử dụng. Tôi tìm thấy nó trong cuốn sách: Kiểm tra lái xe - TDD thực tế và TDD chấp nhận cho nhà phát triển Java bởi 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());
}
}
Lưu ý rằng nguồn thời gian mặc định, DEFAULTSRC, là System.currentTimeMillis(). Nó được thay thế trong các bài kiểm tra đơn vị; tuy nhiên, hành vi bình thường là thời gian hệ thống tiêu chuẩn.
Đây là nơi nó được sử dụng:
public class SimHengstler {
private long lastTime = 0;
public SimHengstler() {
lastTime = SystemTime.asMillis(); //System.currentTimeMillis();
}
}
Và đây là bài kiểm tra đơn vị:
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;
}
});
}
Trong thử nghiệm đơn vị, tôi thay thế TimeSource chỉ với một số trong đó đã được thiết lập đến 1000 mili giây. Điều đó sẽ phục vụ như là thời gian bắt đầu. Khi gọi setEndTime(), tôi nhập 1020 mili giây cho thời gian hoàn thành. Điều này đã cho tôi một sự khác biệt thời gian 20 phần nghìn giây được kiểm soát.
Không có mã thử nghiệm trong mã sản xuất, chỉ nhận được Giờ hệ thống bình thường.
Đảm bảo đặt lại cuộc gọi sau khi thử nghiệm để quay lại sử dụng phương pháp thời gian của hệ thống thay vì thời gian giả.
Nguồn
2009-05-19 22:29:18
Vâng, rằng một số loại công văn kép (tôi nghĩ?) sẽ là cách tiếp cận lý tưởng, quá tệ. NET làm cho nó trở thành một rắc rối để làm điều này. Tôi thỉnh thoảng cuộn giao diện hẹn giờ của riêng mình nhưng luôn cảm thấy như tôi đang giới thiệu sự phức tạp. –
Âm thanh giống như tiêm phụ thuộc hơn so với công văn đôi với tôi. –
Thuật ngữ thuật ngữ nhỏ nhưng tôi cho rằng điều này đúng là gọi công văn kép hoặc khách truy cập.DI của nó chắc chắn nhưng bạn cũng đang dùng một đối tượng và yêu cầu nó áp dụng chính sách cập nhật của nó cho 'this'. –