2012-04-13 68 views
1

我需要測試某些複雜對象的有序List的方法。簡單的例子:測試集合滿足謂詞中的所有元素

class MyObject { 
    public String foo() { return someString; } 
} 

我想測試兩種:訂購返回集合的(因爲我現在是用org.hamcrest.collection.IsIterableContainingInOrder.contains和fulfiling謂詞)。

總結。我在尋找這樣的語法:

@Test 
public void shouldMatchPredicate() { 
    List<MyObject> collection = testObject.generate(); 
    //collection = [myObject#x, myObject#y, myObject#z] 
    assertThat(collection, somePredicate("x", "y", "z") 
} 

默認的,contains方法是行不通的,因爲第一個參數是Collection<MyObject>和謂詞參數是String秒。我需要一些它之間的橋樑。

回答

2

由於Predicate是一個番石榴對象,Hamcrest不依賴番石榴,它不會有一個匹配器將需要Predicate。另外,由於番石榴不依賴Hamcrest,他們也不會提供Matcher。

我建議你自己寫一個匹配謂語的匹配器。這相對容易。獲取IsIterableContainingInOrder的源代碼並將其修改爲Predicate

另一種辦法是做到以下幾點:

assertThat(Iterables.all(myList, myPredicate), CoreMatchers.is(true)); 

這會不會給你一個失敗的多文檔,但它會通過/不通過正常。

1

我會在testObject.generate()中使用MyObjectFactory,避免直接new聲明。 MyObjectFactory將是testObject的依賴項。 這樣做,我會獲得2個好處:

  1. testObjectMyObjecttestObject之間的弱耦合會知道MyObject只有在接口
  2. 的可能性方面嘲笑MyObjectFactory,最後的可能性斷言3個訂購電話:MyObjectFactory.BuildNewWithValue("x")MyObjectFactory.BuildNewWithValue("y")MyObjectFactory.BuildNewWithValue("z")

單元測試將是一個交互測試

要斷言返回的集合本身,我會寫3個斷言。

+0

數據生成超出了範圍這個問題。這是一個非常簡單的例子 - 在我真實的情況下,它使用第三方代碼和通用方法不能被修改。關於斷言 - 是的,它會工作,但我看起來更乾淨的方式(清潔Hamcrest方式?) – 2012-04-13 10:24:25

相關問題