簡體   English   中英

將哪些對象傳遞給Mockito中的自定義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.

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