当前位置: 首页 > 面试题库 >

如何编写单元测试,以确保我的基于日期/时间的代码在所有时区均可使用,而无论是否启用DST?

翁阳曜
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 假设我有以下模型: 我想通过创建一个在将来(今天+ 1或某天)结束的事件进行测试,并对日期和时间进行打桩,以便系统认为我们已经达到了该将来的日期。 就python而言,我希望能够存根所有系统时间对象。这包括,和任何其他标准日期/时间对象。 这样做的标准方法是什么? 问题答案: 编辑 :由于我的答案是此处接受的答案,因此我正在对其进行更新,以使所有人都知道在此同时创建了更好的方法,这是f

  • 问题内容: 我正在使用python(2.7)程序,该程序会产生许多不同的matplotlib图(数据不是随机的)。我愿意实施一些测试(使用unittest)以确保生成的数字正确。例如,我将期望的图形(数据或图像)存储在某个位置,运行我的函数并将结果与​​参考进行比较。有没有办法做到这一点 ? 问题答案: 以我的经验,图像比较测试最终带来的麻烦多于其应有的价值。如果要跨多个系统(例如TravisCI

  • 我有下一个代码: 但当我运行它时,它会出错: TypeError:不支持的类型“ 我尝试了很多方法,但似乎不可能将日期时间保存到DynamoDB。顺便说一句,它在MongoDB中运行良好。 有什么解决办法吗?

  • 问题内容: 如何使该单元测试在所有时区都通过测试,而与DST是否处于活动状态无关? 问题答案: 默认情况下,新用户将使用系统默认时区。如果您想要一个特定的时区,请致电: 对于第二项测试,您想要将其更改为: 请注意,通常不应该使用静态变量,因为它不是线程安全的。(而Joda Time 实现 是 线程安全的。)

  • 问题内容: 我有一种方法,根据从当前日期开始,该方法对从数据库中获取的数据实施不同的逻辑。 我想通过单元测试创​​建对象来测试它,将它们保存在数据库中并调用被测试的方法。但是,为了获得可预测的结果,我每次都需要更改系统日期,而且我不知道如何在Java中执行此操作。 有什么建议吗? 问题答案: 您可以使用当前日期生成预期结果。 或者您编写系统以使用您在测试时提供的日期/时间(而不是时钟),这样,时间

  • 问题内容: 我已经编写了一个单元测试,将文件写入文件系统,没有给它写入工作目录的路径。因此,如果从项目目录执行,它将写入项目根目录;如果在项目父目录中,它将写入父目录根目录。 那么写入目标目录的正确方法是什么?可能是目标目录中的目录? 如果我只用文件指定,它将写入父项目目标而不是项目目标。 更新 :我实际上想要测试完成后的文件。该文件是第三方的提取格式,需要将其发送给第三方。可以打开/关闭该测试,