[英]Mockito 1.9: format the expected value (like “actual formatter” in custom ArgumentMatcher)
[英]What objects will be passed to a custom ArgumentMatcher in Mockito
我正在mockito中創建一個自定義參數匹配器。 使用此示例:
class IsListOfTwoElements extends ArgumentMatcher<List> {
public boolean matches(Object list) {
return ((List) list).size() == 2;
}
}
這讓我想知道為什么參數list
的類型是Object
而不是List
。 傳遞給匹配函數的參數可以是別的嗎? 如果是這樣,示例不應該檢查參數的類型,如果它不是List
,則返回false
?
稍微改一下這個問題:mockito是否承諾只將正確的類型傳遞給matches
函數? 如果是這樣,為什么不使用泛型類型。 如果不是,為什么如果錯誤的類型傳遞給它,示例是否返回false?
ArgumentMatcher
,你將收到一個對象,你有責任投射它。 Mockito將根據班級名稱對其進行描述。 BaseMatcher
,你將收到一個對象,你有責任投射它。 描述只會說明匹配器的內容,而不是預期的內容。 TypeSafeMatcher
,您將收到所選類型的對象,您有責任對其進行描述。 它將為您檢查非nullity和類類型,並在類不匹配時提供合理的錯誤消息。 不要擔心在匹配器中造成糟糕的演員表。 Mockito在驗證和調用匹配中都在一個非常慷慨的try / catch塊中調用其驗證 ,因此無論如何ClassCastException都將返回false(或無法匹配)。
那么,為什么接口Matcher
接受比其類型參數更多的接受?
此方法與Object匹配,而不是泛型類型T.這是因為Matcher的調用者在運行時不知道類型是什么(因為Java泛型的類型擦除)。 這取決於檢查正確類型的實現。
因此,換句話說,即使Matcher被參數化,它也不會在運行時提供非常強大的類型安全檢查。 但是,在Mockito中,它非常有用 - argThat(Matcher<T>)
返回類型為T
而不是Object
的值,因此您不必在測試中每次使用argThat(...)
。
因為mockito匹配器使用Hamcrest匹配器,所以在您提供的javadoc鏈接中,您將看到它繼承了org.hamcrest.Matcher
接口中matches
的簽名,這在實際接口中似乎不是通用的。
如果編譯器正確地完成了他的工作,你可以假設你將獲得正確的類型。
請注意,現在建議使用ArgumentCaptor
方法進行復雜斷言,例如,您可以使用AssertJ(維護FEST-Assert克隆)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.