尝试模拟 java.lang.System 时发生 MockitoException

nho*_*ass 7 java android unit-testing mocking mockito

我有一个模拟类的静态方法的测试用例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类的方法?

kas*_*tom 7

虽然 Mockito 自3.4.0版本以来允许模拟静态方法,但不允许模拟ThreadSystem静态方法,请参阅github 上的评论

最后请注意,Mockito 禁止模拟 System(和 Thread)的静态方法。这些方法与发生在同一线程中的类加载密切相关。在某些时候,我们可能会在类加载中添加检测,以暂时禁用其中的静态模拟,从而模拟这些类,同时我们还需要禁用它们的强化属性。然而,您可以轻松地模拟 Instant.now()。