2017-09-25 66 views
0

在使用JUnit/hamcrest進行單元測試時,是否存在特定的API以檢查集合的大小。使用hamcrest matcher進行jUnit測試 - 如何測試集合的大小。

目前我做的 -

Set<String> result = program.getCollection("inputdata"); 
assertThat(3, is(result.size())); 

是上述可接受的或我應該使用iterableWithSize,如下

assertThat(result, iterableWithSize(3)); 

應該是什麼標準的方式,或者是這兩種方法確定。

回答

2

您的兩個方法是正確的,它只是一個品味的問題,所以你可以選擇任何你最喜歡的

引述iterableWithSize文檔:

iterableWithSize(INT大小) 爲Iterables創建一個匹配器,匹配當在檢查的Iterable上進行單次傳遞時產生等於指定大小參數的項計數

我個人會用簡單的assertEquals

assertEquals(3, result.size()); 

Hamcrest提供了一個更自然的可讀性,所以(我還沒有嘗試過),但我想你可以使用:

assertThat(result, is(iterableWithSize(3))); 
+0

gr8,回答我的問題。 +1。正確的hamcrest提供了更可讀的風格。 – samshers

3

的方法的assertThat簽名是:

<T> void assertThat(T actual, Matcher<? super T> matcher) 

其中:

  • actual爲被比較
  • matcher是一個表達式,內置的{@link匹配器} S,指定允許值

所以所計算的值,其意在讀類似:

assert that this computed value matches that expected value 

鑑於此,在你的問題中斷言:

Set<String> result = program.getCollection("inputdata"); 
assertThat(3, is(result.size())); 

應該表示爲:

assertThat(result.size(), is(3)); 

這是一個微妙的差異,但它是更符合assertThat簽名和Hamcrest匹配器的規範是一致的。

問題的其餘部分處理您是否應該使用isiterableWithSize。以下所有斷言都是(a)在功能上等同的,以及(b)非常暢銷的(恕我直言)。

assertThat(result.size(), is(3)); 
assertThat(result, iterableOfSize(3)); 
assertThat(result, hasSize(3)); 

沒有任何令人信服的理由(除主觀意見之外)選擇其中任何一個。我建議選擇一種方法並持續使用,因爲這裏的「一致性原則」應該優於正確性,因爲它們都是〜同樣正確的。