java - hamcrest 中的严格匹配?

标签 java hamcrest

我正在尝试使用 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");

注意 c 没有错误消息

Expected: every item is not one of {"c", "e", "a"}
     but: an item was "a"

最佳答案

Hamcrest 在可读错误消息方面有点棘手。一些匹配器会创建包含所有错误的有用消息,而其他匹配器(大多数)仅报告第一个错误。

当然,您可以使用“更好”的实现和良好的错误消息创建自己的匹配器。为一两个匹配器执行此操作是可以的,但这可能会导致重新实现 Hamcrest。

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

Assertions.assertThat(list).doesNotContainAnyElementsOf(shouldNotBeInList);

给出此错误消息:

Expecting
 <["a", "b", "c"]>
not to contain
 <["c", "e", "a"]>
but found
 <["c", "a"]>

关于java - hamcrest 中的严格匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015862/

相关文章:

java - Maven "class file for ... not found"编译错误

java - Hamcrest 中的 stringContainsInAnyOrder 匹配器?

java - Mockito's Matcher vs Hamcrest Matcher?

java - Junit:断言列表至少包含一个符合某些条件的属性

java - Tomcat 配置以在不同的端口上接受 HTTPS

java - 查找多个键是否映射到相同的值

java - 完全支持 POJO 中的 JavaFX 属性

Java Spring MVC 使用拦截器转发/重定向 POST 请求

java - 用于比较父类(super class)和子类的 Hamcrest 匹配器

java - JUnit hamcrest 长比较