Mockito mock Kotlin Object類(lèi)方法報(bào)錯(cuò)解決方法
比如我創(chuàng)建一個(gè)Kotlin
Object
類(lèi):ObjectMethod
package com.baichuan.example.unit_test object ObjectMethod { fun doSomething() { println("this is ObjectMethod#doSomething") } @JvmStatic fun doSomethingWithJvmStatic() { println("this is ObjectMethod#doSomethingWithJvmStatic") } }
如果我直接去mock
該類(lèi)的doSomething
方法,會(huì)報(bào)錯(cuò)。
@Test @DisplayName("mock普通的kotlin靜態(tài)方法") fun testMockKotlinObject() { Assertions.assertThrows(MissingMethodInvocationException::class.java) { Mockito.mockStatic(ObjectMethod::class.java).`when`<Unit>( ObjectMethod::doSomething ).thenAnswer { println("this is mocked Object#doSomething") } } ObjectMethod.doSomething() }
這是因?yàn)?code>kotlin里的object
類(lèi)里的方法雖然在kotlin
里從形態(tài)跟使用上來(lái)看與靜態(tài)方法無(wú)二。但是編譯成java
代碼后,其本質(zhì)其實(shí)是內(nèi)部初始化了一個(gè)當(dāng)前類(lèi)的靜態(tài)常量實(shí)例INSTANCE
。這個(gè)INSTANCE
在kotlin
語(yǔ)法里被隱藏了,但在java里依然可以顯示訪問(wèn)。ObjectMethod
編譯成java
后的代碼如下:
public final class ObjectMethod { @NotNull public static final ObjectMethod INSTANCE = new ObjectMethod(); private ObjectMethod() { } public final void doSomething() { String var1 = "this is ObjectMethod#doSomething"; boolean var2 = false; System.out.println(var1); } @JvmStatic public static final void doSomethingWithJvmStatic() { String var0 = "this is ObjectMethod#doSomethingWithJvmStatic"; boolean var1 = false; System.out.println(var0); } }
所以,不能mock
ObjectMethod#doSomething
本質(zhì)上的原因是正常手段無(wú)法mock
靜態(tài)常量。如果想要使kotlin
的object
類(lèi)中的方法能夠被mock
,只需在方法上加上@JvmStatic
注解即可。被其標(biāo)注的方法會(huì)被編譯成普通的java
靜態(tài)方法。
上面說(shuō)正常手段無(wú)法mock靜態(tài)常量,那么非正常手段呢?其實(shí)這個(gè)非正常手段就是通過(guò)反射將被mock
過(guò)的實(shí)例注入到ObjectMethod
中即可。
@Test @DisplayName("通過(guò)反射修改靜態(tài)常量來(lái)mock普通的kotlin靜態(tài)方法") fun testMockKotlinObjectMethodByReflection() { val mock = Mockito.mock(ObjectMethod::class.java) Mockito.`when`(mock.doSomething()).then { print("this is mocked ObjectMethod by reflection") } val declaredMethod = ObjectMethod::class.java.getDeclaredField("INSTANCE") ReflectionUtils.setFinalStatic(declaredMethod, mock) ObjectMethod.doSomething() }
ReflectionUtils
package com.baichuan.example.unit_test import java.lang.reflect.Field import java.lang.reflect.Modifier object ReflectionUtils { @Throws(Exception::class) fun setFinalStatic(field: Field, newValue: Any) { field.isAccessible = true val modifiersField: Field = Field::class.java.getDeclaredField("modifiers") modifiersField.isAccessible = true modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv()) field.set(null, newValue) } }
github
https://github.com/scientificCommunity/blog-sample/tree/main/unit-test-sample
到此這篇關(guān)于Mockito mock Kotlin Object類(lèi)方法報(bào)錯(cuò)解決方法的文章就介紹到這了,更多相關(guān)Mockito mock Kotlin Object類(lèi)方法報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)
這篇文章主要介紹了Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例),分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01SpringBoot部署到Linux讀取resources下的文件及遇到的坑
本文主要給大家介紹SpringBoot部署到Linux讀取resources下的文件,在平時(shí)業(yè)務(wù)開(kāi)發(fā)過(guò)程中,很多朋友在獲取到文件內(nèi)容亂碼或者文件讀取不到的問(wèn)題,今天給大家分享小編遇到的坑及處理方案,感興趣的朋友跟隨小編一起看看吧2021-06-06Mybatis中如何設(shè)置sqlSession自動(dòng)提交
在MyBatis中,默認(rèn)情況下,獲取的SqlSession對(duì)象不會(huì)自動(dòng)提交事務(wù),這意味著在進(jìn)行更新、刪除或插入等操作后,需要顯式調(diào)用commit方法來(lái)提交事務(wù),但是,可以在獲取SqlSession時(shí)通過(guò)將openSession方法的參數(shù)設(shè)置為true2024-09-09java中File類(lèi)應(yīng)用遍歷文件夾下所有文件
這篇文章主要為大家詳細(xì)介紹了java中File類(lèi)應(yīng)用遍歷文件夾下所有文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Java 實(shí)現(xiàn)完整功能的學(xué)生管理系統(tǒng)實(shí)例
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)完整版學(xué)生管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11SpringBoot2.3新特性?xún)?yōu)雅停機(jī)詳解
這篇文章主要介紹了SpringBoot2.3新特性?xún)?yōu)雅停機(jī)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05