Kotlin Mockito使用方法

一、為什么要使用Mockito1.實際案例1.1 遇到的問題對于經常維護的項目,經常遇到一個實際問題:需求不停改變,導致架構經常需要修改某些概念的定義 。
對于某些十分基礎又十分常用的概念,常常牽一發而動全身 。
此時,"重構-測試"循環將會消耗比較多的費用 。
1.2 解決方法1可以通過領域驅動開發,在設計架構之前和相關領域的專家充分溝通,從而從一開始就得到準確的定義 。
同時,在開發過程中對于之后有可能增加新功能的模塊 , 充分增加其可拓展性 。
1.2 解決方法2通過編寫高質量代碼 , 保證單一功能由單一函數負責 , 從而減少增加新功能時的工作量 。
1.3 根本原因不論架構怎樣設計,對于一個經常維護、更新的項目,其必然會在某些時刻遇到修改基本定義的情況 。
而這些基本定義的大量引用,對于一名普通開發者來說 , 不一定能完全照顧到 。
即使照顧到了,也不能保證下一次也同樣不出問題 。
1.4 解決方法3使用自動化測試,在增加代碼后用計算機代替人進行功能測試,從而大大提高測試效率 。
在引入單元測試后,不僅能測試出“是否有問題” , 更能高效找到錯誤出現的位置,效率顯著高于傳統的控制臺輸出調試方法 。
2.行為驅動開發2.1 概覽BDD:行為驅動開發
第一步:編寫一個失敗的"客戶驗收測試",從客戶視角描述系統 。
第二步:寫系統代碼 , 直到驗收測試通過 。
2.2 缺點代碼量大,前期成本高 。
即該方法不適合一次性寫完,之后幾乎不維護的小型程序 。
2.3 優點后期開發效率大大提高 。
因此 , 該方法適用于時常維護,使用時間很長的大型程序 。
二、部署Mockito1.gradle部署build.gradle.kts
dependencies {testImplementation("org.mockito:mockito-core:4.3.1")testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")testImplementation("org.mockito:mockito-inline:4.3.1")testImplementation(fileTree("testLibs"))testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")}注意:testLibs可以改成任意文件夾名,這個文件夾放入你的外部依賴(如spigot的jar)
2.在哪里寫測試代碼

Kotlin Mockito使用方法

文章插圖
import org.junit.jupiter.api.Test;public class TestStarter {@Testpublic void test(){TestCore.INSTANCE.test();}}3.ClassFormatError這是因為你看起來導入了API , 實際上沒有導入好 。
解決方法:把API(如Spigot)的jar文件放入testLibs(或你自己的文件夾名)
SpigotAPI下載地址:https://hub.spigotmc.org/nexus/content/repositories/snapshots/org/spigotmc/spigot-api/
4.ClassNotFoundError這是因為你沒有導入API 。
解決方法:testImplementation("你需要的依賴"),示例如下
testImplementation("io.izzel.taboolib:common:6.0.10-11")testImplementation("io.izzel.taboolib:module-configuration:6.0.10-11")三、使用方法1.mock用來創建一個虛假的對象,如Player 。
val player= Mockito.mock(Player::class.java)這個對象的類型就是Player,可以傳遞給別的方法,并且可以自定義觸發player的方法時 , 執行和返回的內容 。
2.when ... then ...2.1 when ... thenReturn ...val player=mock(Player::class.java)`when`(player.name).thenReturn(playerName)val playerLocation= mock(Location::class.java)`when`(playerLocation.x).thenReturn(0.0)`when`(playerLocation.y).thenReturn(0.0)`when`(playerLocation.z).thenReturn(0.0)這個方法可以用來指定返回值 。
2.2 anyString()對于有參數的方法,可以設定不論傳入什么參數 , 都return特定值 。
anyInt()等同理 。
val map= Mockito.mock(ConfigFile::class.java)Mockito.`when`(map.getString(anyString())).thenReturn("Test")2.3.thenAnswer有時候,我們設置了anyString()之后,想使用實際傳入的參數,就需要thenAnswer() 。
arguments即為傳入的實際參數 。
Mockito.`when`(map.getString(anyString())).thenAnswer { invocation ->val args = invocation.argumentsvar str = args[0] as StringfakeMap.getString(str)}【Kotlin Mockito使用方法】

    推薦閱讀