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