如何使用 hamcrest 断言 Set 具有精确 属性 的项目

How to assert that Set has item with exact property with hamcrest

我一直在尝试使用这个 solution 断言我的 Set 具有给定 属性 和 hamcrest 的集合,但我有 :

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V at org.hamcrest.Condition$Matched.matching(Condition.java:52)

进口:

import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasProperty;
import static org.junit.Assert.assertThat;

代码:

assertThat(mySet, contains(hasProperty("id", equalTo("expectedId"))));

你有什么好的想法吗?

那么,您应该尝试让 assertThat 为您完成工作。

Set<WhateverPropertyTypeYouAreUsing> expectedSet = Collections.singleton( ... create a property object with that id/value);

assertThat(mySet, is(expectedSet))

此处的限制:假定您的集合仅包含一个 属性 值。

否则,您可以选择:

assertThat(mySet.contains(someProperty), is(true))

(可能带有附加消息以更好地描述失败的断言)。

先决条件:您的 属性 class 应该以合理的方式实施 equals()。

另一种方法是:

assertTrue(mySet.contains(someProperty);

你的原始代码没问题。您的问题可能是由于某些版本冲突引起的。顺便说一句,您应该使用 Hamcrest 的 assertThat (import static org.hamcrest.MatcherAssert.assertThat),而不是 JUnit 的