[英]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.