java mockito中文 - 使用Mockito的通用“any()”方法




mockito教學 junit (5)

由於我需要為我的最新項目使用此功能(我們從1.10.19更新過一次),為了讓用戶(已使用mockito-core 2.1.0或更高版本 )保持最新,靜態來自上述答案的方法應該從ArgumentMatchers類中取得:

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

請記住這一點,如果你打算保持你的mockito工件可能從第3版開始更新,那麼這個類可能不再存在了:

根據2.1.0及以上版本,org.mockito.Matchers的javadoc聲明:

使用org.mockito.ArgumentMatchers 。 為了避免與Hamcrest * org.hamcrest.Matchers類發生名稱衝突,現在不推薦使用此類。 這個類可能會在3.0版中被刪除。

我有一個接口,需要一個Foo數組的方法:

public interface IBar {
  void doStuff(Foo[] arr);
}

我正在使用Mockito嘲笑這個接口,並且我想斷言doStuff()被調用,但我不想驗證通過什麼參數 - “不關心”。

如何使用any() ,泛型方法而不是anyObject()來編寫以下代碼?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());


這應該工作

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));

從Java 8開始,您可以使用無參數的any方法,並且編譯器會推斷出類型參數:

verify(bar).doStuff(any());

說明

Java 8中的新事物是表達式的目標類型將被用來推斷其子表達式的類型參數。 在Java 8之前,只有用於類型參數推斷的方法的參數(大部分時間)。

在這種情況下, doStuff的參數類型將成為any()的目標類型,並且any()的返回值類型將被選擇為匹配該參數類型。

原始類型

不幸的是,這對原始類型不起作用:

public interface IBar {
    void doPrimitiveStuff(int i);
}

verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead

問題是編譯器會推斷Integerany()的返回值。 Mockito不會意識到這一點(由於類型擦除)並返回參數類型的默認值,該值為null 。 運行時將嘗試通過調用intValue方法來解除返回值,並拋出異常。


您可以檢查是否存在邏輯明智的id並相應地提供映射信息。 Hibernate不會檢查數據庫是否存在已定義的主鍵。





java unit-testing mocking mockito