日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口

發(fā)布時(shí)間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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類型是一種接口。

  • 我們有一個(gè)界面。 interface KitchenStaff { void serve(MealType mealType); }
  • 我們對Mockito說:“實(shí)例化此接口”(什么?)

    @InjectMocks KitchenStaff waitress
  • 嘿,那不對!
  • 您不能僅在接口上使用@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 error

    A.自己提供參數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。