2016-08-11 1 views
2

私はオブジェクトのリストを持っていますが、オブジェクト自体について真理スタイルのアサーションを作成したいと思いますが、等価アサーションよりも複雑なものを表現する方法はありません。このような何かを表現するための最も真実-yの方法は何だ、これは真実では利用できないと仮定するとIterableで要素についてのアサーションを作成

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

:私のようなものを想定していますか?唯一私が事前にiを知っていれば動作し、任意のために動作しないことを

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

しかし、(多少ハックであることに加えて):私は、私が探していた、リスト内のどの位置を知っていたならば、私のような何かを言うことができます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

関連する問題