Kotlin和Mockk UUID测试。

3

这是一个基于Kotlin-Mockk的测试用例,我试图将静态类“UUID”进行模拟。

当用于获取随机字符串时,它可以正常工作,但无法模拟UUID。

mockkStatic(UUID::class) every { UUID.randomUUID().toString() } returnsMany uuidSource

//This is the uuid source 
val uuidSource = listOf(
    UUID.randomUUID().toString(),
    UUID.randomUUID().toString(),
    UUID.randomUUID().toString()
)

在下面的情况下它可以工作。
@Test
    fun x1() {
        mockkStatic(UUID::class)
        every { UUID.randomUUID().toString() } returnsMany  uuidSource

        listOf(1, 2, 3). forEach { _ ->
            println(UUID.randomUUID().toString())
        }
    }

//但在下面的情况下会出现错误

无法使私有静态长整型java.util.UUID.parse4Nibbles(java.lang.String,int)可访问:模块java.base不向未命名模块@2aae9190打开java.util

@Test fun x1() {
     mockkStatic(UUID::class) every { UUID.randomUUID().toString() } returnsMany         uuidSource
        listOf(1, 2, 3). forEach { _ ->
            println(UUID.randomUUID())
        }
    }

有没有解决第二种情况的方案,或者任何变通方法?

1个回答

0
是的,在第一个情况下,您正在访问`randomUUID()`函数的`toString()`函数,所以模拟它可行。而在第二种情况下,您在模拟`randomUUID().toString()`时访问`randomUUID()`。
不要模拟`randomUUID().toString()`,而是模拟`randomUUID()`本身。
val uuidSource = listOf(
    UUID.fromString("350e8400-e29b-41d4-a716-446655440000"),
    UUID.fromString("450e8400-e29b-41d4-a716-446655440000"),
    UUID.fromString("550e8400-e29b-41d4-a716-446655440000"),
)


@Test fun x1() {
    mockkStatic(UUID::class) 
    every { UUID.randomUUID() } returnsMany uuidSource

    listOf(1, 2, 3).forEach { _ -> println(UUID.randomUUID()) }
}

在这里,我们需要在`uuidSource`中使用`UUID.fromString()`,因为`UUID.randomUUID()`的返回类型是`UUID`。

java.lang.reflect.InaccessibleObjectException: 无法使私有静态方法 long java.util.UUID.parse4Nibbles(java.lang.String,int) 可访问:模块 java.base 未向未命名模块 @271053e1 打开 java.util。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接