相关疑难解决方法(0)

覆盖Java System.currentTimeMillis以测试对时间敏感的代码

有没有办法,无论是在代码中还是在JVM参数中,都可以覆盖当前时间,如System.currentTimeMillis手动更改主机上的系统时钟所示?

一点背景:

我们有一个系统可以运行许多会计工作,这些工作围绕当前日期(即本月的第一天,一年中的第一天等)展开大部分逻辑.

不幸的是,很多遗留代码都会调用诸如new Date()or之类的函数,这些函数Calendar.getInstance()最终都会调用System.currentTimeMillis.

出于测试目的,我们现在仍然需要手动更新系统时钟来操作代码认为运行测试的时间和日期.

所以我的问题是:

有没有办法覆盖返回的内容System.currentTimeMillis?例如,告诉JVM在从该方法返回之前自动添加或减去一些偏移量?

提前致谢!

java testing jvm systemtime

117
推荐指数
7
解决办法
7万
查看次数

使用Java 8 Clock对类进行单元测试

引入了Java 8 java.time.Clock,它可以用作许多其他java.time对象的参数,允许您向它们注入真实或假的时钟.例如,我知道您可以创建一个Clock.fixed()然后调用Instant.now(clock)它将返回Instant您提供的固定.这听起来非常适合单元测试!

但是,我无法弄清楚如何最好地使用它.我有一个类,类似于以下内容:

public class MyClass {
    private Clock clock = Clock.systemUTC();

    public void method1() {
        Instant now = Instant.now(clock);
        // Do something with 'now'
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想对这段代码进行单元测试.我需要能够设置clock生成固定时间,以便我可以method()在不同时间进行测试.显然,我可以使用反射将clock成员设置为特定值,但如果我不必诉诸于反射,那将会很好.我可以创建一个公共setClock()方法,但这感觉不对.我不想Clock在方法中添加一个参数,因为真正的代码不应该关注传入时钟.

处理此问题的最佳方法是什么?这是新代码,所以我可以重新组织这个类.

编辑:为了澄清,我需要能够构造一个MyClass对象,但能够让一个对象看到两个不同的时钟值(就好像它是一个常规的系统时钟一样).因此,我无法将固定时钟传递给构造函数.

java unit-testing java-8 java-time

60
推荐指数
5
解决办法
4万
查看次数

我怎么能模拟java.time.LocalDate.now()

在我的测试用例中,我需要测试时间敏感的方法,在那个方法中我们使用的是java 8类的LocalDate,它不是Joda.

当我正在进行测试时,我可以做些什么来改变时间

java systemtime java-8 java-time

38
推荐指数
3
解决办法
2万
查看次数

标签 统计

java ×3

java-8 ×2

java-time ×2

systemtime ×2

jvm ×1

testing ×1

unit-testing ×1