網(wǎng)站建設(shè)預(yù)付款比例惠州網(wǎng)絡(luò)營銷
測試替身Test Doubles的5類型(Mockito)
我們有一個名為 BankAccount 的類。
數(shù)據(jù)庫用于存儲和檢索銀行帳戶信息。
我們想測試 BankAccount 中的邏輯,而不必?fù)?dān)心它使用的底層數(shù)據(jù)庫.由此類實(shí)現(xiàn)——它將 SQL 查詢發(fā)送到數(shù)據(jù)庫并返回其中包含的值。
測試替身Test Doubles
測試替身是“替代”某些原始類的類,允許測試避免使用原始類代替時所需的一些復(fù)雜性。測試替身有點(diǎn)像特技替身——我們不使用真正的演員,而是使用另一個 看起來像,但讓所有困難的事情看起來很容易!
測試替身的類型
1 Dummies
2 Stubs
3 Fakes
4 Mocks
5 Spies
Dummies
Dummies 是代替實(shí)物的物體
然而,測試從來沒有使用偽,它的目的只是滿足編譯器的要求。
我們假設(shè)BankAccountDatabaseConnection是一個Java接口,我們可以用不同的方式實(shí)現(xiàn)它進(jìn)行測試。但是實(shí)際類的方法可以很容易地被重寫以獲得相同的效果。
數(shù)據(jù)庫本身對此測驗(yàn)并不重要,所以我們只需要一個假dummy來編譯測試。
Stubs
Stubs是覆蓋原始類的某些方法的對象,以便可以測試其他類/方法。
Fakes
Fakes提供了真實(shí)對象的偽實(shí)現(xiàn)。這里是數(shù)據(jù)庫功能的“內(nèi)存中”實(shí)現(xiàn)。
請注意fakes的缺點(diǎn)——本質(zhì)上,我們正在實(shí)現(xiàn)更多需要測試的功能。
Mocks
Mock擴(kuò)展了Stub的概念——它們允許您控制方法返回的值,但也可以確認(rèn)方法是用正確的值作為參數(shù)調(diào)用的。
除非我們使用假的(并為假的寫更多的測試),否則無法確定進(jìn)入數(shù)據(jù)庫以設(shè)置銀行賬戶余額的值是否正確。
Mock:
明確驗(yàn)證是否指示數(shù)據(jù)庫將賬號為1000的余額金額設(shè)置為200英鎊。
Test using mock:
Spies
Spies類似于mock,但沒有Stub方法(返回預(yù)定值的方法)。也就是說,它們只做方法調(diào)用的日志記錄和檢查部分。它們對于檢查單元和外部組件之間的接口很有用。(有時它們甚至被用作集成測試的一部分。)
例如,它們可以用于監(jiān)視方法并檢查是否生成了正確的SQL?;蛘?#xff0c;在調(diào)用服務(wù)發(fā)送電子郵件之前,電子郵件的內(nèi)容是預(yù)期的。
小心Doubles
請注意,有多少示例涉及到關(guān)于類被加倍的許多實(shí)現(xiàn)細(xì)節(jié)。特別是:
?Fakes需要自己的測試(!),因?yàn)樗麄兩婕案鄬?shí)施
?Mocks記錄有關(guān)單個方法調(diào)用的詳細(xì)信息,使它們?nèi)菀鬃兊么嗳酢?br /> 因此,請小心使用Doubles,并且僅在必要時使用。
保持事情盡可能真實(shí)往往是最好的方法,同時避免雙重性。
Mockito
每次你想測試一些東西時,寫一個新的測試Doubles可能會很痛苦,很快。
Mockito是生成用于JUnit的mock的有用框架。
由于Mocks是Stubs和Spices,而Stubs更專業(yè)的Dummies版本,Mockito可以生成除Fake之外的所有類型的Doubles。
Mock example with Mockito
Test using manually written mock:
Manually- written mock class:
Test using virtual mock:
在 Java 中,虛擬模擬測試是指在單元測試期間使用模擬框架來模擬依賴項(xiàng)或外部組件的行為的做法。 模擬是一種用于隔離被測試代碼的技術(shù),它通過用可以控制和驗(yàn)證的虛假實(shí)現(xiàn)替換真實(shí)的依賴關(guān)系。
以下是如何在 Java 中進(jìn)行虛擬模擬測試的一般概述:
-
選擇模擬框架:Java 有幾種流行的模擬框架,例如 Mockito、PowerMock 和 EasyMock。 選擇一個適合您需要的,并將其作為依賴項(xiàng)包含在您的項(xiàng)目中。
-
Identify the Dependencies:確定需要模擬的外部依賴。 這些依賴項(xiàng)通常是您的代碼所依賴的其他類、接口或外部服務(wù)。
-
創(chuàng)建模擬對象:使用模擬框架,創(chuàng)建模擬依賴項(xiàng)行為的模擬對象。 這些模擬對象將在測試期間替換真實(shí)的實(shí)現(xiàn)。
-
定義模擬行為:指定模擬對象的期望行為。 您可以將它們配置為返回特定值、模擬異?;蛟谡{(diào)用某些方法時執(zhí)行其他操作。
-
將模擬注入到測試中:在您的測試代碼中,將模擬對象注入到被測試的類或方法中。 這通常是通過構(gòu)造函數(shù)注入、setter 注入或使用像 Spring 這樣的依賴注入框架來完成的。
-
編寫測試用例:編寫測試用例以執(zhí)行被測代碼的功能。 當(dāng)代碼調(diào)用模擬依賴項(xiàng)上的方法時,它們將根據(jù)模擬對象中定義的行為做出響應(yīng)。
-
驗(yàn)證交互:執(zhí)行被測試的代碼后,您可以使用模擬框架的驗(yàn)證功能來斷言特定方法在模擬對象上被調(diào)用并使用預(yù)期參數(shù)。
-
運(yùn)行測試:使用您喜歡的測試框架(例如 JUnit 或 TestNG)執(zhí)行測試用例。 測試框架將運(yùn)行測試并報告任何失敗或錯誤。
通過使用虛擬模擬測試,您可以在不依賴實(shí)際依賴項(xiàng)的情況下有效地隔離和測試各個代碼單元,從而使測試過程更加集中和高效。 Mocking 允許您模擬不同的場景、邊緣情況和錯誤條件,以確保您的代碼在各種情況下都能正確運(yùn)行。
使用mock()生成mock對象。我們從來沒有(也不需要)看到任何實(shí)際的代碼——因?yàn)樗鼰o論如何都不存在
為mock生成“Stubbed”方法
Fake Turned Into a Mock
Test using manually written fake:
Manually written fake class:
它只是為了測試,但我們也需要測試它!
我們可以改用Mock。
此代碼類似于Mock的最后一個示例。
Dummy Example with Mockito
Test using manually written dummy:
Manually written dummy class:
Test using virtual mock (which is a dummy in this case):
生成模擬對象。 由于我們不去stub或驗(yàn)證任何方法,因此它實(shí)際上是一個dummy
Stub Example with Mockito
Test using manually written stub:
Manually written stub class:
生成模擬對象并“stub”一個方法。
由于我們不去驗(yàn)證任何方法,它實(shí)際上是一個Stub
Mockito——總結(jié)
Mockito 可以省掉很多手動寫 double 的工作。
Mockito 可以做的比我們在這里介紹的更多,請參閱
https://site.mockito.org/
Double會導(dǎo)致脆弱的測試。
始終考慮集成測試是否更合適。