mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口
mockito接口沒法賦值
使用Mockito進(jìn)行Java類的模擬和存根的任何人,可能都熟悉InjectMocks -annotation。 在要測試的類上使用此批注,Mockito將嘗試通過構(gòu)造函數(shù)注入,setter注入或?qū)傩宰⑷雭碜⑷肽M。 魔術(shù)成功了,它無聲地失敗了,或者拋出了MockitoException 。
我想解釋什么原因?qū)е?strong>“ MockitoException:無法實(shí)例化名為xxx的@InjectMocks字段! 原因:類型是接口”以及解決方法。
問題
考慮以下JUnit 5測試,該測試可以驗(yàn)證女服務(wù)員是否可以正確提供早餐。 廚房工作人員中的任何人都可以提供早餐,并且該測試會驗(yàn)證當(dāng)提供早餐時(shí),咖啡機(jī)開始沖泡咖啡,而烤面包機(jī)開始烘烤。
@ExtendWith (MockitoExtension. class ) public class WaitressTest { @Mock CoffeeMachine coffeeMachine; @Mock Toaster toaster; @InjectMocks KitchenStaff waitress; @Test void should_serve_breakfast() { waitress.serve(BREAKFAST); verify(coffeeMachine).brew(); verify(toaster).toast(); } } interface KitchenStaff { void serve(MealType mealType); } Waitress class implements KitchenStaff { CoffeeMachine coffeeMachine; Toaster toaster; //... @Override public void serve(MealType mealType) { coffeeMachine.brew(); toaster.toast(); } }出于此測試的目的,Mockito模擬了協(xié)作的coffeeMachine和toaster -因此它們需要Mock注釋-這樣我們可以驗(yàn)證是否調(diào)用了預(yù)期的方法。 女服務(wù)員是真的 ,她正在接受測試。 通過在她身上放置@InjectMocks ,Mockito創(chuàng)建一個(gè)實(shí)例并傳入兩個(gè)協(xié)作者-然后調(diào)用我們實(shí)際的@Test -annotated方法。
不幸的是,它失敗了:一旦運(yùn)行測試,Mockito就會引發(fā)運(yùn)行時(shí)異常: “無法實(shí)例化名為'waitress'的@InjectMocks字段! 原因:“ KitchenStaff”類型是接口?!?/strong>
原因
幸運(yùn)的是,最近Mockito的錯(cuò)誤消息已得到改進(jìn),并且清楚地指出了問題所在: KitchenStaff類型是一種接口。
您不能僅在接口上使用@InjectMocks ,因?yàn)镸ockito需要知道要實(shí)例化的具體類 。
請記住,您正在測試的單元是通常是真實(shí)的少數(shù)幸運(yùn)之一。 KitchenStaff只是一個(gè)行為合同, Waitress實(shí)際上是獲得酬勞以供應(yīng)早餐。
解
與使用抽象類一樣 ,也有一些,但是歸結(jié)為: 在實(shí)例聲明時(shí)提供具體的類型。
給Mockito提供實(shí)現(xiàn)接口的類。
A)聲明具體類型
對@InjectMocks字段的類型使用具體的實(shí)現(xiàn)。
@InjectMocks Waitress waitress;B)分配具體類型
繼續(xù)對@InjectMocks字段使用接口的類型,但是使用具體的實(shí)現(xiàn)對其進(jìn)行初始化。
@InjectMocks KitchenStaff waitress = new Waitress()或者當(dāng)然在聲明和初始化中使用具體類型,當(dāng)然也可以
然而…
但是,您的受測類是否期望(必需)協(xié)作者作為構(gòu)造函數(shù)的參數(shù)?
(我當(dāng)然希望如此!)
例如,考慮以下單個(gè)構(gòu)造函數(shù):
Waitress class implements KitchenStaff { final CoffeeMachine coffeeMachine; final Toaster toaster; Waitress(CoffeeMachine coffeeMachine, Toaster toaster) { this .coffeeMachine = coffeeMachine; this .toaster = toaster; }然后,在沒有一個(gè)無參數(shù)的構(gòu)造函數(shù), 編譯器會告訴你調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù),并提供論據(jù)就在那里,現(xiàn)在 。
@InjectMocks KitchenStaff waitress = new Waitress() ^^ compiler errorA.自己提供參數(shù)來解決。
// compiles again @InjectMocks KitchenStaff waitress = new Waitress(coffeeMachine, toaster);B.刪除@InjectMocks 。 您不再需要它 。
KitchenStaff waitress; @BeforeEach void setup() { waitress = new Waitress(coffeeMachine, toaster); }結(jié)論
相信女服務(wù)員為您做些敬酒。
翻譯自: https://www.javacodegeeks.com/2020/07/mockito-cannot-instantiate-injectmocks-field-the-type-is-an-interface.html
mockito接口沒法賦值
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老旧电脑显示器图片(老式电脑显示屏图片)
- 下一篇: SonarQube 8.3.x中的Mav