【问题标题】:How to unit test a time dependent method with JUnit如何使用 JUnit 对时间相关方法进行单元测试
【发布时间】:2019-01-26 00:01:57
【问题描述】:

我有以下方法,它采用 UNIX 时间戳并以天、小时或分钟的形式返回年龄。我想用 JUnit 对其进行单元测试,但我不确定我将如何开始这样做,因为当前时间在不断变化。有什么建议吗?谢谢!

方法如下:

public static String getAge(long unixTime) throws Exception {
        long diff = (System.currentTimeMillis() / 1000) - unixTime;
    diff = diff / 60;
    if (diff < 60) {
        return Math.round(diff) + " m";
    }
    else
        diff /= 60;
    if (diff < 24) {
        return Math.round(diff) + " h";
    }
    else {
        diff /= 24;
        return Math.round(diff) + " d";
    }

}

【问题讨论】:

  • 使用Clock 获取“当前时间”。在测试中,提供一个带有已知“当前时间”的Clock,以便您知道预期的结果。在生产中使用系统时钟,以便您获得实时时间。
  • 我认为Math.round(diff)long 没有任何影响。
  • Writing and testing convenience methods using Java 8 Date/Time classes 的可能重复项。无论如何,我相信这个问题和我对它的回答对你很有帮助。

标签: java unit-testing time


【解决方案1】:

我会根据当前时间在我的 unitTest 中构建一个 unix 时间戳。该方法的结果粒度足够粗,以至于创建参数和执行此方法之间的几毫秒差异不会很重要。当然,您需要避开边界条件,即 unixTime 为 60 分钟和 24 小时。

public void testMinutes() {
    Instant minutesAgo = Instant.ofEpochMilli(System.currentTimeMillis() - 15 * 60 * 1000);
    String result = getAge(minutesAgo.getEpochSecond());
    assertSomething...
}

等等数小时和数天的测试。

【讨论】:

  • 我同意您的评论并编辑了答案。
  • 非常感谢!这似乎比我发现的任何其他解决方案都更直接
【解决方案2】:

要么你应该改变一个方法的设计来接受当前时间和unixTime,或者你必须退出纯JUnit并使用PowerMock来模拟System.currentTimeMillis() em> 返回所需的结果。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多