java - mockito教學 - powermock




使用Mockito的通用“any()”方法 (3)

從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方法來解除返回值,並拋出異常。

我有一個接口,需要一個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));




mockito