2013-08-02 41 views
1

我想使用模擬並檢查傳入模擬的參數是否正確ArrayList<MyModel>。我已經在MyModel上定義了布爾型equals方法,但我找不到使用equals方法的正確匹配器。我一直在寫的匹配器只比較明顯不同的object_id。我的測試看起來像這樣:Hamcrest ArrayList匹配器

MainActivity activity = mock(MainActivity.class); 
MyRequest subject = new MyRequest(activity); 
ArrrayList<MyModel> list = ...; 
subject.makeRequest(); 
verify(activity).handleSuccess(argThat(is(list))); 

有誰知道將使用布爾等於上MyModel一個匹配?

+0

爲什麼這不適合你? 'valid(activity).handleSuccess(argThat(equalTo(expected)));' – aim

+0

@aim它比較object_id,並且因爲被調用的參數是一個不同的'ArrayList'實例,所以相等比較返回false。 – trev9065

+2

嗯..我認爲'equalTo'在ArrayList上調用相等,然後它應用在列表的每個元素上(像這樣的'java.util.AbstractList#equals')... – aim

回答

0

根據the Hamcrest tutorial,可以使用以下任一使用Object.equals進行比較:

  • argThat(is(list))
  • argThat(is(equalTo(list))
  • argThat(equalTo(list))

此外,List.equals(Object)具體定義爲比較e1.equals(e2)對於每個元素e1e2在列表中的相應位置。

仔細檢查您已完成你需要做適當覆蓋equals一切:

  • MyModel.equals方法收到Object參數而不是MyModel?如果參數是Object以外的任何其他類型,則它不是正確的重寫,並且不起作用。
  • MyModel.equalsreflective, symmetric, transitive, and consistent?您的equals不太可能在另一個方向上失敗,但不能保證將調用哪個對象的方法。
  • 當兩個對象相等時,它們的hashCode值是否返回相等的整數?在檢查對象之間的相等性之前,集合實現是free to check hash code equality as a "shortcut"

要檢查這些要點,您可能需要編寫專門針對equals的測試。我推薦Guava's EqualsTester,它會自動爲您檢查大部分屬性。

相關問題