相关疑难解决方法(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.lang.System 时发生 MockitoException

我有一个模拟类的静态方法的测试用例java.lang.System

@Test
fun `getLocalTime()`() {
    // Arrange
    val staticMock = Mockito.mockStatic(System::class.java)
    Mockito.`when`(System.currentTimeMillis()).thenReturn(1000L)

    // Action
    val res = deviceTimeProvider.getLocalTime()

    // Assert
    Truth.assertThat(res).isEqualTo(1000L)

    staticMock.close()
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,我得到了这个错误:

org.mockito.exceptions.base.MockitoException:不可能模拟 java.lang.System 的静态方法以避免干扰类加载,从而导致无限循环

为什么会出现这种情况?我如何模拟java.lang.System类的方法?

java android unit-testing mocking mockito

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

标签 统计

java ×2

android ×1

jvm ×1

mocking ×1

mockito ×1

systemtime ×1

testing ×1

unit-testing ×1