使用 Hamcrest 檢查集合是否包含元素
1. 概述
當我們用 Java 編寫單元測試時,尤其是使用 JUnit 框架時,通常會驗證Collection
是否包含特定元素。作為一個功能強大的函式庫,Hamcrest 提供了一種簡單而富有表現力的方法來使用Matcher
執行這些檢查。
在本快速教學中,我們將探索如何使用 Hamcrest 的Matcher
檢查Collection
是否包含特定元素。此外,由於數組是常用的資料容器,我們還將討論如何對數組執行相同的檢查。
2. 設定 Hamcrest
在深入範例之前,我們需要確保 Hamcrest 包含在我們的專案中。如果我們使用 Maven,我們可以將以下依賴項新增到pom.xml
中:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.2</version>
<scope>test</scope>
</dependency>
我們可以檢查 Maven Central 來取得最新版本的 Hamcrest。
因此,讓我們準備一個List
和一個陣列作為輸入:
static final List<String> LIST = List.of("a", "b", "c", "d", "e", "f");
static final String[] ARRAY = { "a", "b", "c", "d", "e", "f" };
接下來,我們檢查它們是否包含特定元素。
3.使用Hamcrest Matcher
和assertThat()
Hamcrest 提供了一組豐富的Matcher
來與Collection
一起使用。要檢查Collection
是否包含特定元素,我們可以使用org.hamcrest.Matchers
類別中的hasItem()
Matcher
。讓我們透過一些範例來了解其在實踐中的工作原理。
首先,讓我們import static
hasItem()
方法以使程式碼易於閱讀:
import static org.hamcrest.Matchers.hasItem;
然後,我們可以使用它來驗證Collection
是否包含或不包含元素:
assertThat(LIST, hasItem("a"));
assertThat(LIST, not(hasItem("x")));
在上面的程式碼中,我們使用**not()
方法來否定匹配參數的邏輯。**
hasItem()
方法可以直接驗證Collection
是否包含元素。但是,我們不能用它來檢查數組。
要檢查陣列是否包含特定元素,我們可以使用hasItemInArray()
方法,該方法也來自org.hamcrest.Matchers
類別:
assertThat(ARRAY, hasItemInArray("a"));
assertThat(ARRAY, not(hasItemInArray("x")));
如範例所示,我們可以透過使用 Harmcrest 方便的hasItem()
和hasItemInArray()
輕鬆解決我們的問題。
4.使用JUnit的assertTrue()
和assertFalse()
我們已經看到了 Harmcrest 的Matcher
,它很容易使用。或者,我們可以使用JUnit的assertTrue()
和assertFalse()
方法來達到目的:
assertTrue(LIST.contains("a"));
assertFalse(LIST.contains("x"));
這次,我們使用Collection
的contains()
方法來檢查Collection
中是否存在目標元素。
但是,如果輸入是數組,則與Collection.contains()
不同,沒有簡單的一次性方法可以檢查。幸運的是,我們有多種方法來檢查 Java 中的陣列是否包含值。
接下來,讓我們看看如何將這些方法與 JUnit 的assertTrue()
和assertFalse()
一起使用:
assertTrue(Arrays.stream(ARRAY).anyMatch("a"::equals));
assertFalse(Arrays.asList(ARRAY).contains("z"));
如程式碼所示,我們可以將陣列轉換為List
,或使用Stream API來檢查陣列中是否存在特定值。
從上面的範例中,我們也可以看到,如果我們想要檢查一個Collection
是否包含某個元素,Hamcrest Matcher
和 JUnit 斷言使用Collection.contains()
方法都很簡單。但是,當我們需要對數組執行相同的檢查時,Hamcrest Matcher
可能是更好的選擇,因為它們更緊湊且更易於理解。
5. 結論
在這篇簡短的文章中,我們探討了使用 JUnit 和 Hamcrest 斷言Collection
或陣列是否包含特定元素的各種方法。
使用 Hamcrest 的hasItem()
或hasItemInArray()
,我們可以輕鬆驗證單元測試中Collection
或陣列中是否存在特定元素。此外, Matcher
使我們的測試更具可讀性和表現力,增強了測試程式碼的清晰度和可維護性。
或者,我們可以使用Java標準API提供的方法來檢查Collection
和陣列是否包含目標元素,然後使用JUnit的標準assertTrue()
和assertFalse()
斷言來完成這項工作。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。