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