2016-08-11 69 views
2

我有一個對象列表,我想對對象本身進行Truth樣式的斷言,但我沒有看到任何合理的方式來表達比平等斷言更復雜的東西。我設想是這樣的:關於可迭代元素的斷言

assertThat(list).containsElementThat().matches("Foo .* Bar"); 

假設這不是真理可用,什麼是最真實-Y的方式來表達這樣的事情?如果我知道我一直在尋找我可以說這在列表中的位置是這樣的:

assertThat(list).hasSize(Math.max(list.size(), i)); 
assertThat(list.get(i)).matches("Foo .* Bar"); 

但(除了是有點哈克),只有當我事先知道i工作,以及任意不起作用iterables。有沒有比自己做這個更好的解決方案?

回答

3

您可以試一試com.google.common.truth.Correspondence

public class MatchesCorrespondence<A> extends Correspondence<A, String> { 
    @Override 
    public boolean compare(@Nullable A actual, @Nullable String expected) { 
     return actual != null && actual.toString().matches(expected); 
    } 

    // other overrides 
} 

然後你就可以斷言這樣的:

assertThat(list) 
    .comparingElementsUsing(new MatchesCorrespondence<>()) 
    .contains("Foo .* Bar"); 
+0

哦有意思,我以前沒見過的'Correspondence'!儘管如此,這仍然很奇怪例如虛構的'assertThat(list).containsElementThat()。hasLength(5)'將成爲'assertThat(list).comparingElementsUsing(stringLengthCorrespondence).contains(5)'這是很難解析的。無可否認,它比自己重新實現一切都要好得多。 – dimo414

+0

@ dimo414這是真的。但你也可以嘗試做一個拉請求,讓事情變得更好:) – vsminkov

+1

不要害怕,這是我的計劃:)只是在我這樣做之前試圖瞭解世界的狀態。 – dimo414