我有一个需要获取当前时间的类。当我开始为该类编写测试时,我将时间功能抽象到外部类中,然后将其注入到原始类中,并且可以在测试时进行模拟。这一切都工作正常,但现在我有一个我想测试的时钟类。如何测试此类?
import java.util.Date;
public class Clock {
public long getCurrentTime() {
return new Date().getTime();
}
}
注意:目前非常简单,但我打算在继续测试时扩展它以包含更多时间方法。
测试这个类可能没有意义,但如果你坚持,例如,如果你是项目中唯一一个类为 0% 的人 测试覆盖率 ;-)那么这里有一个解决方案:
public void testClock() throws InterupteExcdeption {
Clock testClock = new Clock();
long time1 = testClock.getCurrentTime();
Thread.sleep(1000);
long time2 = testClock.getCurrentTime();
assertTrue(time2 > time1);
}
public void testClock2() throws InterupteExcdeption {
Clock testClock = new Clock();
long time1 = testClock.getCurrentTime();
Thread.sleep(1000);
long time2 = testClock.getCurrentTime();
assertTrue(time2 - time1 > 800);
long time3 = testClock.getCurrentTime();
long time4 = testClock.getCurrentTime();
// expecting a value of 0, but make the test defensive, use 100ms
assertTrue(time4 - time3 < 100);
}
进一步提示:你的时钟类应该实现一个IClock
接口,否则很难用测试用例的模拟替换系统时钟。
IClock的想法是,你可以设置一个模拟时钟,例如运行速度快十倍,或者你可以设置时间,然后由getCurrentTime()返回。