利用Mockito的捕獲功能改善測試

2021-10-06 23:30:26 字數 1393 閱讀 3877

單元測試強制要求在隔離測試單元。 為了實現這一點,通常的共識是使用di以分離的方式設計我們的類。 在這種正規化中,無論是否使用框架,使用編譯時還是執行時編譯,物件例項化都是專用工廠的責任。 特別是,這意味著new關鍵字應僅在這些工廠中使用。

但是,有時不適合擁有專門的工廠。 將窄範圍的例項注入到更大範圍的例項時,就是這種情況。 我最近偶然發現的乙個用例是事件匯流排,它是這樣的**:

public

class

sample

public

void

done

()private

result

computeresult

()}

使用執行時di框架(例如spring框架),並且如果doneevent沒有引數,則可以將其更改為查詢方法模式。

public

void

done

()public

abstract

doneevent

getdoneevent

();

不幸的是,這種論點只是阻止我們使用這個漂亮的把戲。 無論如何,它不能通過執行時注入來完成。 但是,這並不意味著不應該測試done()方法。 問題不僅在於如何斷言在呼叫該方法時是否在匯流排上發布了新的doneevent,而且還檢查了包裝的結果。

經驗豐富的軟體工程師可能知道mockito.any(class<?>)方法。 可以這樣使用:

public

void

doneshouldpostdoneevent

()

在這種情況下,我們確保將正確型別的事件發布到佇列中,但是我們不確定結果是什麼。 而且,如果無法確定結果,則對**的置信度會降低。 mockito進行營救。 mockito提供捕獲,就像引數的佔位符一樣。 上面的**可以這樣更改:

public

void

doneshouldpostdoneeventwithexpectedresult

()

我們建立乙個新的argumentcaptor

我們用captor.capture()替換any()用法,技巧就完成了。

然後,結果由mockito捕獲,並可以通過captor.getcapture()

使用hamcrest,確保結果是預期的結果。

翻譯自:

單鏈表的實現(增 刪 查 改功能)

標頭檔案函式 ifndef slistnode h define slistnode h typedef int datatype typedef struct slistnode slistnode slistnode buyslistnode datatype x void slistprint...

實現線性順序表的增刪查改功能

實現線性順序表的增刪查改功能,主要有main.h main.c list.c 三個模組函式實現。ifndef main h define main h define size 500 typedef int data t typedef struct list enum e list enum e ...

如何利用VC的Remote Debug功能

環境 vc6 sp4 winxp 假設有下面一段 void cchildview onpaint 如果你要在除錯的過程中 每次畫線的結果在本機上進行除錯 表示斷點 是不可能的,因為每次返回到vc中時,wm paint訊息有會重新傳送到視窗,並且視窗上的內容也會消失。在vc中提供了remote deb...