最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mockito mock Kotlin Object類方法報錯解決方法

 更新時間:2021年09月13日 08:40:42   作者:穹柏  
這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

比如我創(chuàng)建一個Kotlin Object類: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該類的doSomething方法,會報錯。

  @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()
  }

這是因為kotlin里的object類里的方法雖然在kotlin里從形態(tài)跟使用上來看與靜態(tài)方法無二。但是編譯成java代碼后,其本質(zhì)其實是內(nèi)部初始化了一個當(dāng)前類的靜態(tài)常量實例INSTANCE。這個INSTANCEkotlin語法里被隱藏了,但在java里依然可以顯示訪問。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ì)上的原因是正常手段無法mock靜態(tài)常量。如果想要使kotlinobject類中的方法能夠被mock,只需在方法上加上@JvmStatic注解即可。被其標(biāo)注的方法會被編譯成普通的java靜態(tài)方法。

上面說正常手段無法mock靜態(tài)常量,那么非正常手段呢?其實這個非正常手段就是通過反射將被mock過的實例注入到ObjectMethod中即可。

	@Test
	@DisplayName("通過反射修改靜態(tà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類方法報錯解決方法的文章就介紹到這了,更多相關(guān)Mockito mock Kotlin Object類方法報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于springboot 長輪詢的實現(xiàn)操作

    基于springboot 長輪詢的實現(xiàn)操作

    這篇文章主要介紹了基于springboot 長輪詢的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java適配器模式之如何靈活應(yīng)對不匹配的接口

    Java適配器模式之如何靈活應(yīng)對不匹配的接口

    本文介紹了Java中的適配器模式,包括對象適配器模式和接口適配器模式,適配器模式通過將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口,解決了不同接口之間的不兼容問題,它提高了系統(tǒng)的靈活性、復(fù)用性和解耦性,需要的朋友可以參考下
    2024-10-10
  • Java_Spring之XML?的?AOP?配置

    Java_Spring之XML?的?AOP?配置

    這篇文章主要介紹了Java_Spring中基于XML的AOP配置,上篇講到的是基于注解的AOP配置,對XML感興趣的同學(xué)可以參考閱讀本文
    2023-04-04
  • Java 中責(zé)任鏈模式實現(xiàn)的三種方式

    Java 中責(zé)任鏈模式實現(xiàn)的三種方式

    本文重點給大家介紹java中如何編寫責(zé)任鏈模式。主要從下面3個框架中的代碼中介紹。非常不錯,需要的朋友參考下吧
    2017-09-09
  • springboot HandlerIntercepter攔截器修改request body數(shù)據(jù)的操作

    springboot HandlerIntercepter攔截器修改request body數(shù)據(jù)的操作

    這篇文章主要介紹了springboot HandlerIntercepter攔截器修改request body數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。
    2021-06-06
  • SpringBoot項目使用mybatis-plus代碼生成的實例詳解

    SpringBoot項目使用mybatis-plus代碼生成的實例詳解

    mybatis-plus是mybatis的增強(qiáng),不對mybatis做任何改變,涵蓋了代碼生成,自定義ID生成器,快速實現(xiàn)CRUD,自動分頁,邏輯刪除等功能。本文就來講講SpringBoot項目如何使用mybatis-plus實現(xiàn)代碼生成,需要的可以了解一下
    2022-10-10
  • java編程之基于SpringBoot框架實現(xiàn)掃碼登錄

    java編程之基于SpringBoot框架實現(xiàn)掃碼登錄

    本文將介紹基于SpringBoot + Vue + Android實現(xiàn)的掃碼登錄demo的總體思路,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • 詳解java實現(xiàn)HTTP請求的三種方式

    詳解java實現(xiàn)HTTP請求的三種方式

    這篇文章主要介紹了java實現(xiàn)HTTP請求的三種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring MVC如何設(shè)置響應(yīng)

    Spring MVC如何設(shè)置響應(yīng)

    本文介紹了如何在Spring框架中設(shè)置響應(yīng),并通過不同的注解返回靜態(tài)頁面、HTML片段和JSON數(shù)據(jù),此外,還講解了如何設(shè)置響應(yīng)的狀態(tài)碼和Header
    2025-01-01
  • StringBuilder如何拼接(截取)想要的字符串

    StringBuilder如何拼接(截取)想要的字符串

    文章主要介紹了Java中字符串操作的兩種常用類StringBuilder和StringBuffer,以及三元表達(dá)式的使用和字符串截取的方法
    2024-12-12

最新評論

巢湖市| 体育| 平凉市| 连山| 克山县| 安图县| 屏边| 黄陵县| 黑水县| 兴安盟| 望奎县| 万全县| 双流县| 靖江市| 永平县| 启东市| 宜都市| 万州区| 泸水县| 亚东县| 富蕴县| 襄垣县| 盐城市| 泰顺县| 潮安县| 廉江市| 兴文县| 惠来县| 上饶县| 玉山县| 苏尼特右旗| 呈贡县| 八宿县| 邹城市| 富宁县| 阳江市| 松阳县| 库车县| 平凉市| 阜平县| 高淳县|