![](/img/trans.png)
[英]I'm getting an error here when I call my getChoice() method, and I don't know why
[英]I don't know why I'm getting an error simply by creating a new Clock object
我收到一条错误消息,指出“无法实例化时钟类型”,但我不知道为什么。
import java.time.Clock;
public class TS1 {
public long getTime(){
Clock c = new **Clock**(); //Error occurs here for bold Clock
return c.millis();
}
}
这种抽象的主要目的是允许在需要时插入备用时钟。 应用程序使用对象而不是静态方法来获取当前时间。 这可以简化测试。
要使用抽象Clock
类的millis()
方法,您不必扩展它,您可以使用java.time 包中的给定实现。 例如,您可以声明以下方法:
import java.time.Clock;
public class App {
public static long getMillis(Clock clock){
return clock.millis();
}
}
在您的应用程序中,您可以获得系统时钟实现,而不是使用对System.currentTimeInMillis()
的直接和静态调用:
Clock systemClock = Clock.systemUTC();
System.out.println(getMillis(systemClock));
此应用程序代码取决于操作系统时钟,其结果因每次运行时间而异。
在您的测试代码中,您可以使用固定时钟实例,因此无论测试时间如何,结果都是确定性和可预测的(当然,对于许多测试场景,您将使用模拟对象):
import static org.junit.Assert.*;
import org.junit.Test;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneOffset;
@Test public void checkSampleUTCTime(){
Clock fixedClock = Clock.fixed(Instant.parse("2016-04-21T11:54:20.00Z"), ZoneOffset.UTC);
assertEquals(1461239660000L,App.getMillis(fixedClock));
}
此外,有些人会说 joda time DateTimeUtils
类( 请参阅 javadoc )是更好的选择 - 因为您可以使用setCurrentMillisFixed()
和setCurrentMillisSystem()
来替代系统时钟行为,而不是java.time.Clock
依赖注入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.