簡體   English   中英

Mockito 匹配特定的 Class 參數

[英]Mockito match specific Class argument

我正在嘗試模擬一些動態生成的資源。 為了生成這些資源,我們必須傳入一個類參數。 例如:

FirstResourceClass firstResource = ResourceFactory.create(FirstResourceClass.class);

SecondResourceClass secondResource = ResourceFactory.create(SecondResource.class);

這很好,直到我試圖嘲笑。 我正在做這樣的事情:

PowerMockito.mockStatic(ResourceFactory.class);
FirstResourceClass mockFirstResource = Mockito.mock(FirstResourceClass.class);
SecondResourceClass mockSecondResource = Mockito.mock(SecondResourceClass.class);

PowerMockito.when(ResourceFactory.create(Matchers.<Class<FirstResourceClass>>any()).thenReturn(mockFirstResource);
PowerMockito.when(ResourceFactory.create(Matchers.<Class<SecondResourceClass>>any()).thenReturn(mockSecondResource);

似乎模擬被注入到調用類中,但FirstResourceClass正在發送mockSecondResource ,這會引發編譯錯誤。

問題是(我認為)使用 any() (我從這個問題中得到的)。 我相信我必須使用isA() ,但我不確定如何進行該方法調用,因為它需要一個Class參數。 我試過FirstResourceClass.class ,這給出了一個編譯錯誤。

你想要eq ,如:

PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class)))
    .thenReturn(mockFirstResource);

any()忽略參數,並且isA將檢查你的參數是否屬於某個類——但不等於等於一個類,只是它是某個類的instanceof any(Class)具有any()中的1.x的Mockito語義和isA在2.x的語義)

isA(Class.class)沒有你需要區分你的電話那么具體,所以eq它是。 無論如何,類對象具有明確定義的相等性,因此這對於您的用例來說是簡單而自然的。

因為如果您不使用匹配器,則eq是默認值,所以這也適用:

PowerMockito.when(ResourceFactory.create(FirstResourceClass.class))
    .thenReturn(mockFirstResource);

請注意,較新版本的 Mockito 已棄用 Matchers 名稱以支持 ArgumentMatchers,並且Mockito.eq也可以工作(雖然笨拙,因為它們是“繼承”的靜態方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM