如何使用JUnit对时间相关的方法进行单元测试

时间:2019-01-26 00:01:58

标签: java unit-testing time

我有以下方法,该方法采用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";
    }

}

2 个答案:

答案 0 :(得分:0)

要么应该更改方法的设计以同时接受当前时间和 unixTime ,要么必须退出纯JUnit并使用PowerMock模拟 System.currentTimeMillis()返回所需的结果。

答案 1 :(得分:0)

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

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

以此类推,进行了数小时和数天的测试。