令人惊讶的注射
所以,我欠吉姆道歉。 他編寫了一個(gè)有效的模擬和JUnit測(cè)試,我在回顧中告訴他,我認(rèn)為它沒有達(dá)到他的預(yù)期。 當(dāng)我錯(cuò)了時(shí),這種情況對(duì)我來說就像是一個(gè)錯(cuò)誤 。 稱其為理想的意外副作用。
假設(shè)您有以下兩類:
public class Service { private String name; private Widget widget; public Service(String name, Widget widget) { this .name = name; this .widget = widget; } public void execute() { widget.handle(name); } } public interface Widget { void handle(String thing); }那里沒什么令人興奮的…
現(xiàn)在,讓我們嘗試使用Mockito測(cè)試(此處為JUnit 5)測(cè)試服務(wù):
@ExtendWith (MockitoExtension. class ) class ServiceTest { @Mock private Widget widget; @InjectMocks private Service service = new Service( "Joe" , widget); @Test void foo() { service.execute(); verify(widget).handle( "Joe" ); } }測(cè)試通過。 但是應(yīng)該嗎?
對(duì)我來說, @InjectMocks批注旨在作為一種工廠方法來創(chuàng)建依賴于模擬值的東西,在測(cè)試中用@Mock表示。 這就是我通常使用的方式,并且我也希望生態(tài)系統(tǒng)中的所有對(duì)象都是使用構(gòu)造函數(shù)注入構(gòu)建的。
這是一個(gè)很好的設(shè)計(jì)原則,但不是工具功能的定義!
應(yīng)用此批注的外觀與在注釋字段的過程@InjectMocks ,并采取不同的路徑,如果它的null比,如果它已經(jīng)初始化。 對(duì)于null路徑是一種聲明式構(gòu)造函數(shù)注入方法如此純粹,我完全不認(rèn)為注入模擬可能意味著對(duì)現(xiàn)有對(duì)象執(zhí)行此操作。 該文檔也不太清楚這一點(diǎn)。
- 如果沒有對(duì)象,則@InjectMocks必須創(chuàng)建一個(gè)
- 它使用可以提供的最大構(gòu)造函數(shù)
- 如果有一個(gè)對(duì)象,它將嘗試通過setter來填充模擬
- 如果沒有設(shè)置器,它將嘗試通過直接設(shè)置字段來強(qiáng)制破解模擬,并強(qiáng)制沿途對(duì)其進(jìn)行訪問
最重要的是, @InjectMocks靜默@InjectMocks失敗,因此您可能會(huì)在不知道的情況下進(jìn)行神秘的測(cè)試失敗。
更重要的是,有些人在Mockito Runner頂部的測(cè)試中使用MockitoAnnotations.initMocks()調(diào)用,這會(huì)導(dǎo)致各種奇怪的事情!!! 認(rèn)真的家伙,永遠(yuǎn)不要打電話。
得到教訓(xùn)
嗯...對(duì)不起,吉姆!
@InjectMocks批注的確會(huì)盡其所能來做最有用的事情,但是場(chǎng)景越復(fù)雜,預(yù)測(cè)就越困難。
在我看來,使用兩種橫切技術(shù)來初始化對(duì)象是一種危險(xiǎn)且難以理解的方法,但是,只要有記錄,如果可行,則它可能比其他方法更好。 添加評(píng)論!
也許需要某種@InjectWithFactory ,您可以在其中聲明一個(gè)接收所需@InjectWithFactory的方法,并在構(gòu)造時(shí)使用@Mock對(duì)象調(diào)用該方法,以便您填充其余測(cè)試上下文中的任何其他參數(shù)。
或者,也許我們只是習(xí)慣了這項(xiàng)工作,而忘記了它是否易于理解。
最終思想
我通過創(chuàng)建測(cè)試并調(diào)試Mockito庫以發(fā)現(xiàn)它如何實(shí)現(xiàn)結(jié)果,來了解Mockito在上面的工作。 我強(qiáng)烈建議您以這種方式瀏覽您最常用的庫。 您將學(xué)到一些有用的東西!
翻譯自: https://www.javacodegeeks.com/2019/11/a-surprising-injection.html
總結(jié)
- 上一篇: 虎鞭是什么 虎鞭原来是这个
- 下一篇: 苹果11拍照夜间模式如何打开