@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 後,會指示編譯器這部分 按...