0
次のコードは、ストリームのサイズに関するより自然なアサーションを可能にするように設計されています。マッチャの作成<Stream>(jUnit)
Matcher<Stream> hasCount(int count) {
return new TypeSafeDiagnosingMatcher<Stream>() {
protected boolean matchesSafely(Stream stream, Description desc) {
long streamCount = stream.count();
if (streamCount == count) {
return true;
} else {
desc.appendText("count ").appendValue(streamCount);
return false;
}
}
public void describeTo(Description desc) {
desc.appendText("count ").appendValue(count);
}
};
}
これは、のようなアサーションができます:それはエラー が「ストリームがすでに時に操作または閉鎖されている」返すアサーションが通過するときにそれが正常に動作しますが、それが失敗したとき
assertThat(getWidgetStream(), hasCount(52));
(例えばassertThat(Stream.empty(), hasCount(1));
を)予想される説明「expected:count < 1」ではなく、「< 0>」となります。
TypeSafeDiagnosingMatcherのソースを確認したところ、matches
とdescribeMismatch
の両方からmatchesSafely
が呼び出されました。だからHamcrestはmatchesSafely
が私のものではない冪等であると仮定しています。
この問題を回避する方法はありますか?
'mtachedSafely'は' describedTo'の後に 'but:... 'の部分のデシジョンを生成するために2度目に呼び出されます。それは行く方法だと思われる。 – SubOptimal
@SubOptimalはいこれは最も簡単な解決策だと思われますが、hamcrestでは 'matchesSafely'を2回呼び出すことができると考えているようです。 – sprinter
しかし[IsCollectionContainingTest.java](https://github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-core/src/test/java/org/hamcrest/core/IsCollectionContainingTest.java#L89)を見てくださいこれは意図された方法です。 – SubOptimal