Java hamcrest的严格匹配?

Java hamcrest的严格匹配?,java,hamcrest,Java,Hamcrest,我尝试使用Hamcrest,但经常遇到以下问题: Hamcrest匹配器是短路的,因此对于例如,如果我写: Assert.assertThat(list, everyItem(not(isIn(shouldNotBeInList)))); 仅报告了shouldNotBeInList的第一个故障元素。我希望测试能告诉我尽可能多的信息 我是否可以在hamcrest中编写断言,它们报告得很好,以便报告所有的不匹配,或者我是否应该创建自己的匹配器或使用另一个库 示例输出 List<String

我尝试使用Hamcrest,但经常遇到以下问题:

Hamcrest匹配器是短路的,因此对于例如,如果我写:

 Assert.assertThat(list, everyItem(not(isIn(shouldNotBeInList))));
仅报告了shouldNotBeInList的第一个故障元素。我希望测试能告诉我尽可能多的信息

我是否可以在hamcrest中编写断言,它们报告得很好,以便报告所有的不匹配,或者我是否应该创建自己的匹配器或使用另一个库

示例输出

List<String> list = Arrays.asList("a", "b", "c");
List<String> shouldNotBeInList = Arrays.asList("c", "e", "a");

对于可读的错误消息,Hamcrest有点棘手。一些匹配器会创建一条包含所有错误的有用消息,而另一些(大多数)只报告第一个错误

当然,您可以使用“更好”的实现和良好的错误消息创建自己的匹配器。为一两个匹配者这样做是可以的,但最终可能会重新实现Hamcrest

如果您可以选择使用其他库,请查看。断言

Assertions.assertThat(list).doesNotContainAnyElementsOf(shouldNotBeInList);
给出此错误消息:

Expecting
 <["a", "b", "c"]>
not to contain
 <["c", "e", "a"]>
but found
 <["c", "a"]>
期望
不包含
但是发现
公共静态void main(字符串[]args){
List=Arrays.asList(“a”、“b”、“c”);
列表不应该是nlist=Arrays.asList(“c”、“e”、“a”);
Assert.assertThat(list,everyFullCheck(not(isIn(shouldNotBeInList)));
}
公共静态类EveryFullCheck扩展了TypeSafeDiagnosingMatcher{

private final MatcherThanks我可以编写自定义断言,但这样一个库IMHO的要点是在默认情况下提供有意义的错误消息。
Expecting
 <["a", "b", "c"]>
not to contain
 <["c", "e", "a"]>
but found
 <["c", "a"]>
public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b", "c");
        List<String> shouldNotBeInList = Arrays.asList("c", "e", "a");

        Assert.assertThat(list, everyFullCheck(not(isIn(shouldNotBeInList))));
    }

    public static class EveryFullCheck<T> extends TypeSafeDiagnosingMatcher<Iterable<T>> {
        private final Matcher<? super T> matcher;

        public EveryFullCheck(Matcher<? super T> matcher) {
            this.matcher= matcher;
        }

        @Override
        public boolean matchesSafely(Iterable<T> collection, Description mismatchDescription) {
            boolean matches = true;
            for (T t : collection) {
                if (!matcher.matches(t)) {
                    if (!matches) {
                        mismatchDescription.appendText(", ");
                    }
                    mismatchDescription.appendText("an item ");
                    matcher.describeMismatch(t, mismatchDescription);
                    matches = false;
                }
            }
            return matches;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("every item is ").appendDescriptionOf(matcher);
        }
    }

    private static <U> EveryFullCheck<U> everyFullCheck(Matcher<? super U> matcher) {
        return new EveryFullCheck<>(matcher);
    }
        }