您可以
@Rule为此使用。这是规则的代码:
import org.joda.time.DateTimeZone;import org.junit.rules.TestWatcher;import org.junit.runner.Description;public class UTCRule extends TestWatcher { private DateTimeZone origDefault = DateTimeZone.getDefault(); @Override protected void starting( Description description ) { DateTimeZone.setDefault( DateTimeZone.UTC ); } @Override protected void finished( Description description ) { DateTimeZone.setDefault( origDefault ); }}
您可以使用如下规则:
public class SomeTest { @Rule public UTCRule utcRule = new UTCRule(); ....}
这将在
SomeTest执行每个测试之前将当前时区更改为UTC,并且将在每次测试后恢复默认时区。
如果要检查多个时区,请使用如下规则:
import org.joda.time.DateTimeZone;import org.junit.rules.TestWatcher;import org.junit.runner.Description;public class TZRule extends TestWatcher { private DateTimeZone origDefault = DateTimeZone.getDefault(); private DateTimeZone tz; public TZRule( DateTimeZone tz ) { this.tz = tz; } @Override protected void starting( Description description ) { DateTimeZone.setDefault( tz ); } @Override protected void finished( Description description ) { DateTimeZone.setDefault( origDefault ); }}
将所有受影响的测试放在抽象基类中
AbstractTZTest并对其进行扩展:
public class UTCTest extends AbstractTZTest { @Rule public TZRule tzRule = new TZRule( DateTimeZone.UTC );}
这将
AbstractTZTest使用UTC 执行所有测试。对于您要测试的每个时区,您将需要另一个类:
public class UTCTest extends AbstractTZTest { @Rule public TZRule tzRule = new TZRule( DateTimeZone.forID( "..." );}
由于测试用例是继承的,仅此而已-您只需要定义规则即可。
以类似的方式,您可以移动系统时钟。使用调用规则
DateTimeUtils.setCurrentMillisProvider(...)以模拟测试在特定时间运行并
DateTimeUtils.setCurrentMillisSystem()恢复默认值。
注意:您的提供程序将需要一种使时钟滴答作响的方法,否则所有新
DateTime实例将具有相同的值。每次
getMillis()调用时,我通常将值提前一毫秒。
注意2:仅适用于joda-time。它不影响
new java.util.Date()。
注意3:您无法再并行运行这些测试。它们必须按顺序运行,否则其中一个将很有可能在运行另一个测试时恢复默认时区。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)