当前位置: 首页 > 知识库问答 >
问题:

Hamcrest:如何使用任一/或可组合匹配器集合

严亮
2023-03-14

我正在编写一些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>>)

所以,我不明白如何使用这个方法,也不明白它作为参数的期望是什么。我知道。或()方法具有匹配器

我只知道使用

有人能给我解释一下吗?


共有1个答案

赵征
2023-03-14

有时很难将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)
 类似资料:
  • 输入: null 目标是使以下语句可编译: 这里有什么用?它想让我<编码>匹配器<?super java.util.list >并告诉我通过了 。那么如何在这里传递匹配器集合呢? 有一个关于将集合与hamcrest进行比较的问题,但没有传递Matchers集合的示例,而不是元素。

  • 我正试图将Hamcrest匹配器引入到我的团队的一些代码中。为了消除匹配实例集合的复杂性,我想为我的每个匹配器编写一个帮助器方法,我希望匹配的集合。所以本质上,我是在包装容器InAnyOrder。也就是说,如果有人以null作为预期和实际传递,我希望它匹配。但是按照我编写代码的方式,如果为预期传递null,它将抛出一个NullPointerExcION。所以我想返回一个IsNull匹配器,如果nu

  • 可与一起使用,以检查给定属性的值,例如: 当name是一个属性时,这很好,即:有一个名为的方法。 是否有匹配器将检查不是属性的方法?ie:在这种情况下,它将检查集合中项的方法的返回值,而不是。

  • 它看起来像hamcrest(尽管看起来,还有更多)。为什么我会选择使用(除了看起来类稍微小一点之外),为什么这两个类如此相似?

  • 我试图使用JUnit/Hamcrest断言集合至少包含一个自定义逻辑断言为true的元素。我希望有像“anyOf”这样的匹配器,它采用lambda(或匿名类定义),在这里我可以定义自定义逻辑。我试过TypeSafeMatcher,但不知道该怎么处理它。 我不认为任何一个是我想要的,因为这似乎需要一个匹配者的名单。

  • 我需要检查是否一个url是有效的和空值是可接受的以及。我是这个图书馆的新手,被这个错误难倒了。