必须确保在方法中调用 。因此,一个测试不会影响另一个测试。即使测试中发生异常,TestNG 也应该调用。DateTimeUtils.setCurrentMillisSystem()
tearDown
tearDown
当我想将类与 .我介绍一个接口和一个实现,如下所示:System.currentTimeMillis();
Clock
SystemClock
public interface Clock {
public long getCurrentTimeMillis();
}
public class SystemClock implements Clock {
public long getCurrentTimeMillis(){
return System.currentTimeMillis();
}
}
对于测试,很容易创建一个模拟,该模拟在每次调用或一系列预定义的时间返回固定时间。
有些人可能会争辩说,引入这样一个接口来解耦一种方法是过度工程化的,这将对性能产生影响。但幸运的是,我们有一个JIT编译器,并且由于JIT知道只有类被加载,所以它知道不存在其他实现(目前)。在这个假设下,它可以只使用内联方法。SystemClock
因此,我更喜欢以最佳测试方式编写代码。
编辑
在 Java 8 中,您可能希望使用 Supplier<Long>
接口。
例如,在客户端代码中,您可以使用方法引用
public class SomeClass {
private Supplier<Long> currentTimeMillisSupplier;
public SomeClass(){
this(System::currentTimeMillis);
}
SomeClass(Supplier<Long> currentTimeMillisSupplier){
this.currentTimeMillisSupplier = currentTimeMillisSupplier;
}
}
默认构造函数用于“正常”使用,而另一个包作用域构造函数可用于单元测试。只需将测试类放在同一包中即可。
您也可以使用该界面,因为它是一个@FunctionalInterface
。Clock
public class SomeClass {
private Clock clock;
public SomeClass(){
this(System::currentTimeMillis);
}
public SomeClass(Clock clock){
this.clock = clock;
}
}