Mockito 經過使用 equals()
這種天然的 Java 樣式來校驗參數值。有時候,當須要有其餘一些靈活性的時候,你可能會要求使用參數匹配(argument matchers)。html
請參考下面的代碼:java
//stubbing using built-in anyInt() argument matcher
when(mockedList.get(anyInt())).thenReturn(
"element"
);
//stubbing using custom matcher (let's say isValid() returns your own matcher implementation):
when(mockedList.contains(argThat(isValid()))).thenReturn(
"element"
);
//following prints "element"
System.out.println(mockedList.get(
999
));
//you can also verify using an argument matcher
verify(mockedList).get(anyInt());
//argument matchers can also be written as Java 8 Lambdas
verify(mockedList).add(argThat(someString -> someString.length() >
5
));
|
參數匹配運行進行靈活校驗或者打標。安全
請訪問 https://static.javadoc.io/org.mockito/mockito-core/3.0.0/org/mockito/hamcrest/MockitoHamcrest.html 連接來查看更多有關自定義參數匹配器/hamcrest matchers(custom argument matchers/hamcrest matchers)的內建參數匹配器和示例。ide
更多有關 自定義參數匹配器(custom argument matchers)的使用,請參考 ArgumentMatcher
類的 API 文檔。測試
在使用複雜參數匹配器的時候須要謹慎。嘗試給一個乾淨而且簡單的測試的時候,儘可能選擇天然的參數匹配使用的是 equals()
對比相對偶然使用 anyX()
來講。有時候可能對你的代碼進行一些重構來容許 equals()
進行匹配,或者能夠實現(implement)equals()
方法來幫助進行測試。ui
同時,請閱讀 Capturing arguments for further assertions (Since 1.8.0) 頁面中的內容,或者參考 ArgumentCaptor
類的 API。rest
ArgumentCaptor
是有關參數匹配器的是特殊實現,可以爲後面的對比(assertions)捕獲參數變量。code
若是你如今正在使用參數匹配器,全部參數(all arguments)都必須由 matches 提供。htm
下面的示例代碼顯示校驗,可是一些將會應用到打標中。element
verify(mock).someMethod(anyInt(), anyString(), eq(
"third argument"
));
//above is correct - eq() is also an argument matcher
verify(mock).someMethod(anyInt(), anyString(),
"third argument"
);
//above is incorrect - exception will be thrown because third argument is given without an argument matcher.
|
像 anyObject()
, eq()
Matcher 方法不會返回 matchers。
在內部,他們將會在堆棧(stack)中記錄一個 matcher 而後返回一個虛假的值(一般爲 null)。
這種實現方式是基於 Java 編譯器中有關靜態類型的安全性問題而考慮的,從而帶來的結果是你不能在 verified/stubbed 方法外部使用 anyObject()
, eq()
。