我正在编写一些JUnit/Akruillian类测试,用Hibernate测试一些持久性方法。因此,我必须从数据库中获取许多Hibernate实体列表,并且为了更好地编写测试,我正在使用JUnit Hamcrest框架。在这一刻,我想使用组合匹配器,特别是其中之一。我知道我可以用anyOf()
方法替换它,但出于代码易读性的原因,我更喜欢组合匹配器。我不明白如何使用或()。下面是一个简单的例子:
@Test
public void EitherOrMatcherSimple() {
List<String> keywords = Arrays.asList("1");
assertThat(keywords, CombinableMatcher.either(empty()).
or(nullValue()).
or(both(hasItem("1")).and(hasItem("2"))));
}
这样,我总是从Eclipse得到一个错误,比如:
The method or(Matcher<? super Collection<? extends Object>>) in the type CombinableMatcher<Collection<? extends Object>> is not applicable for the arguments (CombinableMatcher<Iterable<? super String>>)
所以,我不明白如何使用这个方法,也不明白它作为参数的期望是什么。我知道。或()
方法具有匹配器
我只知道使用
有人能给我解释一下吗?
有时很难将Hamcrest matchers与类型安全相结合。你的例子就是其中之一。如果没有明确的演员阵容,甚至可能不可能把它做好。
这是一个解决编译器问题的解决方案:
assertThat(
keywords,
CombinableMatcher.either(empty())
.or(nullValue())
.or((Matcher<? super Collection<?>>) both(hasItem("1")).and(hasItem("2")))
);
如果我理解正确,那么问题是hasItem的签名过于严格:
org.hamcrest.Matcher<java.lang.Iterable<? super T>> hasItem(T item)