如何从Kotlin中的对象获取Java类?

时间:2019-06-07 22:06:31

标签: unit-testing kotlin mockito kotlin-reflect

我正在尝试mockito模拟使用Java类作为参数的getValue函数。

为简化起见,我做了以下测试:

@Test
fun test1() {
    val map = HashMap<String,Any>()
    val v:Long = 1L 
    map["K"]= v

    println(map["K"]!!::class.java) //prints class java.lang.Long
    println(Long::class.java) //prints long

    val dss = Mockito.mock(DataSnapshot::class.java)

    Mockito.`when`(dss.getValue( map["K"]!!::java.class))
            .thenReturn( map["K"]!!)

    //production code uses calls the function like this but it fails to get the value. Returns null;
    Assert.assertEquals( map["K"],dss.getValue(Long::class.java))
}

如照片所示,map["K"]!!::class.java中的类型不同于Long::class.java

如果我使用内联类型模拟该方法,则可以正常工作:

Mockito.`when`(dss.getValue( Long::class.java))
            .thenReturn( map["K"]!!)

我该如何以不必由长开关逻辑确定类型参数的方式来模拟该方法?

kotlin和java类型的一些内幕可能会有所帮助。

1 个答案:

答案 0 :(得分:2)

如果要针对java.lang.Long断言,请使用Long?::class.javaLong::class.java将为您提供JVM上的原始long。可空的Long会映射到盒装版本-java.long.Long