簡體   English   中英

Mockito.any返回null

[英]Mockito.any returns null

我試圖用這樣的參數模擬一個靜態方法:

Mockito.when(StaticClass.staticMethod(Mockito.any(A.class), 
                                      Mockito.any(B.class), SomeEnum.FOO))
       .thenReturn(true);

我添加了以下注釋:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Parameterized.class)
@PrepareForTest({StaticClass.class, A.class, B.class})

但是Mockito.any總是返回null 為什么?

首先,您不能將匹配器與實際參數混合使用。 您也應該為SomeEnum參數使用匹配器:

Mockito.when(StaticClass.staticMethod(Mockito.any(A.class), 
                                      Mockito.any(B.class), Mockito.eq(SomeEnum.FOO))
       .thenReturn(true);

其次,any()方法應該返回null。 這正是他們所做的。 如果查看這些方法的代碼,如果它是原始包裝器對象(如Integer,Boolean等),則返回類類型的默認值,否則返回null:

public <T> T returnFor(Class<T> clazz) {
    return Primitives.isPrimitiveOrWrapper(clazz) ? Primitives.defaultValueForPrimitiveOrWrapper(clazz) : null;
}

你弄錯了。 獨一無二的匹配方法,例如任何(目的是,以匹配在執行時進來的參數。

您可以使用這些方法來指示模擬框架您希望發生的調用。 或者反過來你用它們說:如果這個或那個作為參數出現,那么就這樣做。

因此,您絕對不關心匹配器調用的結果。

從這個意義上說,你的問題表明你對模擬框架的使用是錯誤的。 因此,我們可以給出關於您當前輸入的唯一答案:A)進行更多研究如何使用模擬和B)然后重新設計您的問題以明確您的問題。

簡答:使用doReturn().when()而不是when().then()

在這里可以找到很長的答案: Mockito匹配器如何工作?

匹配器返回虛擬值,例如零,空集合或null。 Mockito嘗試返回一個安全的,適當的虛擬值,如0表示anyInt()或任何(Integer.class),或者為anyListOf(String.class)返回一個空列表。 但是,由於類型擦除,Mockito缺少類型信息來返回任何值,但null為任何()

NullPointerException或其他異常:調用when(foo.bar(any()))。thenReturn(baz)實際上會調用foo.bar(null),在接收null參數時,您可能已將其存根以引發異常。 切換到doReturn(baz).when(foo).bar(any())跳過存根行為。

附注:此問題也可以描述為如何在對空參數進行前置條件檢查的方法上使用Mockito匹配器?

這是因為它是參數化測試,我在@Before方法中做了mockStatic。 當我使用相同的方法執行mockStatic時,它可以工作。

暫無
暫無

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

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