kotlin mockk用法解析

2021-10-25 11:52:59 字數 4563 閱讀 1300

@slf4j

public

class

serviceimpla

implements

service

", s);}

@override

public string dosomething2

(string s)

", s)

;return s;

}}

文中會出現乙個定義:可mock狀態

通過mockk<>(),mockkobject(),spyk()返回的物件就處於mock狀態。只有處於這個狀態的物件才能通過every對物件的行為進行mock

這個方法返回t的例項,該例項所有函式都為待mock狀態,這些待mock狀態的函式都不能直接呼叫,需要結合every{}mock對應方法後才能呼叫

//返回serviceimpla乙個mock物件

val mockk = mockk()

//mock指定方法

every returns unit

//呼叫被mock的方法

mockk.

dosomething1(""

)//該方法未通過every進行mock,會報錯

mockk.

dosomething2(""

)

與mockk<>()的區別是返回的mock物件,允許mock行為跟真實行為並存,如果不主動mock,則執行真實行為

val serviceimpla =

serviceimpla()

mockkobject

(serviceimpla)

every returns unit

//呼叫被mock方法

serviceimpla.

dosomething1

("sfas"

)//呼叫真實方法

serviceimpla.

dosomething2

("sfas"

)

//返回serviceimpla的乙個spyk物件

val spyk = spyk()

every returns unit

//呼叫mock方法

spyk.

dosomething1

("123"

)//呼叫真實方法

spyk.

dosomething2

("999"

) val serviceimpla =

serviceimpla()

//返回serviceimpla物件被spyk後的物件,原物件不會改變

val spyk1 =

spyk

(serviceimpla)

//serviceimpla不是可mock狀態,這裡會報錯

//every returns unit

//mock

every returns unit

//同上

spyk1.

dosomething1

("999"

) spyk1.

dosomething2

("999"

)

作用是定製mock行為的結果

val spyk = spyk()

//mock dosomething2,無論什麼輸入都返回111

every returns "111"

val input =

"222"

//這裡拿到的應該是111

val mockkresult = spyk.

dosomething2

(input)

println

("mockk行為結果:$mockkresult"

) val real =

serviceimpla()

//這裡拿到的應該是222

val realresult = real.

dosomething2

(input)

println

("mockk行為結果:$realresult"

)

有時候我們可能需要在mock行為裡做一些運算而不僅僅只是定製乙個結果,這個時候就需要answers

val input =

"222"

val spyk = spyk()

//定製mock行為

every answers

//呼叫會執行answers裡**

spyk.

dosomething2

(input)

every propertytype string:

:class

answers

spyk.

dosomething2

(input)

val input =

"222"

val spyk = spyk()

every propertytype string:

:class

answers

andthen

spyk.

dosomething2

(input)

spyk.

dosomething2

(input + input)

//次數不會重制,會定位到最後乙個mock行為

spyk.

dosomething2

(input)

val input1 =

"222"

val input2 =

"222111"

val spyk = spyk()

every propertytype string:

:class

answers

andthen andthenthrows (

runtimeexception()

) spyk.

dosomething3

(input1, input2)

spyk.

dosomething3

(input1 + input1, input2 + input2)

//第三次丟擲runtimeexception

spyk.

dosomething3

(input1, input2)

val spyk = spyk()

//定義函式mock行為

val functionanswer = functionanswer

//定義異常mock行為,返回乙個執行時異常

val throwinganswer =

throwinganswer

(runtimeexception()

)//定義多個行為處理集合,按新增順序觸發

val manyanswersanswer =

manyanswersanswer

(listof

(functionanswer, throwinganswer)

)//mock

every returns "" andthenanswer (functionanswer

) andthenanswer (throwinganswer

) andthenanswer (manyanswersanswer

//構造了兩個constantanswer組成乙個manyanswersanswer物件

//listof裡輸入的每個元素會最終賦值到constantanswer的answer方法呼叫上

//如果這裡傳入的是字串,則代表這個answer就僅僅是返回這個字串

//這裡的泛型對應裡spyk.dosomething2()的返回引數型別

) andthenmany (

listof

("functionanswer"

,"throwinganswer"))

//第一次執行進入到returns ""

spyk.

dosomething2

("1"

)//進入functionanswer

spyk.

dosomething2

("2"

)try

catch(e

: runtimeexception)

//進入manyanswersanswer中的functionanswer

spyk.

dosomething2

("4"

)try

catch(e

: runtimeexception)

//將返回functionanswer

println

("第6此呼叫返回:$"

) spyk.

dosomething2

("7"

)

srand time NULL 用法解析

在一些產品的源 中,經常會發現有這樣的語句,srand unsigned time null 為什麼要這樣做呢,其實很簡單。1.time 函式表示返回1970 1 1 00 00 00 到當前時間的秒數,而time null 表示獲取乙個時間,準確的說,獲取乙個指標的位址。2.srand 函式是產生...

Objective C define 用法解析

在 c 語言中,預處理 preprocessor 是非常強大的工具,能讓你的 變得更加易讀和易改。利用預處理 你可以重新定義 的一部分,使得你的 更適合你的風格。預處理 preprocessor 在 編譯之前被提前處理。預處理 均由乙個井號 打頭。define宣告主要用於將常量 或字串 賦予有意義的...

extern c 用法解析

c 保留了一部分過程式語言的特點,因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是一種物件導向的程式語言,為了支援函式的過載,c 對全域性函式的處理方式與c有明顯的不同。extern c 的主要作用就是為了能夠正確實現c 呼叫其他c語言 加上extern c 後,會指示編譯器這部分 按...