gpt4 book ai didi

java - 如何编写单元测试以确保我的基于日期/时间的代码适用于所有时区以及有/无 DST?

转载 作者:IT老高 更新时间:2023-10-28 20:52:39 29 4
gpt4 key购买 nike

我正在使用 JodaTime 2.1,我正在寻找一种模式来对代码进行单元测试,该代码执行日期/时间操作,以确保它在所有时区都表现良好并且独立于 DST .

具体来说:

  1. 如何模拟系统时钟(这样我就不必模拟我调用 new DateTime() 的所有地方来获取当前时间)
  2. 如何对默认时区执行相同操作?

最佳答案

您可以使用 @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:您不能再并行运行这些测试。它们必须按顺序运行,否则其中一个很可能会在另一个测试运行时恢复默认时区。

关于java - 如何编写单元测试以确保我的基于日期/时间的代码适用于所有时区以及有/无 DST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10846704/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com