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

有没有一种方法来创建一个静态方法,将返回一个Hamcrest匹配器匹配一个集合或匹配空?

冀俊良
2023-03-14

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

/**
 * Matches all Foo objects in an order agnostic manner.
 * @param expected The collection of Foo objects to be matched.
 * @return A matcher that will match a collection of Foos
 */
@SuppressWarnings("unchecked")
public static Matcher<Iterable<? extends Foo>> matchesAllfoos(Collection<Foo> expected)
{
    if (expected == null)
    {
        // Doesn't work because Matcher<Iterable> is not a Matcher<Iterable<? extends Foo>>
        return nullValue(Iterable.class);
    }

    // The cast is here to provide a hint to Java as to which overloaded method to choose.
    // See http://stackoverflow.com/questions/18614621/conflicting-overloads-for-hamcrest-matcher
    return containsInAnyOrder((Collection)Collections2.transform(expected, FOO_TO_MATCHER));
}

那么,我如何完成我想做的事情呢?使用nullValue()不起作用,因为它希望我返回Matcher。强制转换nullValue(Iterable.class)不起作用。有什么想法吗?

共有1个答案

司马自明
2023-03-14

如果仔细观察,nullValue(Class

因此,如果您打电话:

public static <T> Matcher<T> nullValue(Class<T> type) {
    return new IsNull<T>();
}

最后(由于泛型很难解决,因为您无法计算出潜在的null对象的运行时类),您可以直接调用构造函数:

new IsNull<Iterable<? extends Foo>>();

因此,解决方案是只使用它,而不使用nullValue()实用程序方法:

/**
 * Matches all Foo objects in an order agnostic manner.
 * @param expected The collection of Foo objects to be matched.
 * @return A matcher that will match a collection of Foos
 */
@SuppressWarnings("unchecked")
public static Matcher<Iterable<? extends Foo>> matchesAllfoos(Collection<Foo> expected)
{
    if (expected == null)
    {
        return new IsNull<Iterable<? extends Foo>>();
    }

    // The cast is here to provide a hint to Java as to which overloaded method to choose.
    // See http://stackoverflow.com/questions/18614621/conflicting-overloads-for-hamcrest-matcher
    return containsInAnyOrder((Collection)Collections2.transform(expected, FOO_TO_MATCHER));
}

 类似资料:
  • 问题内容: 我正在尝试匹配模式: 以下仅匹配第一次出现的情况: 结果是: 但是,[使用pythex似乎可以正常工作](http://pythex.org/?regex=%3C–(%5B%5Cw%5Cs%5D%2B)–%3E(%5B%5Cs%5CS%5D*%3F)(%3F%3D%5Cn%3C–%7C%24)&test_string=%3C–%20Option%201%20–%3E%0ANice%20

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

  • 我正在编写一些JUnit/Akruillian类测试,用Hibernate测试一些持久性方法。因此,我必须从数据库中获取许多Hibernate实体列表,并且为了更好地编写测试,我正在使用JUnit Hamcrest框架。在这一刻,我想使用组合匹配器,特别是其中之一。我知道我可以用方法替换它,但出于代码易读性的原因,我更喜欢组合匹配器。我不明白如何使用

  • 我有一个接口,它提供了一个方法,返回一个,其中包含一个

  • 我有一个正在测试的方法,它返回一个对象列表。。。例如“Person”对象。 我有一个“预期的最后名字”列表来验证结果。 我目前有一个工作测试,它循环遍历“expectedLastNames”中的名称,并断言每个名称都包含在“Person”对象列表中。与此类似(请注意,以下代码段位于Kotlin中): 当断言通过时,这非常有效,并验证了我的方法。然而,当测试失败时,这是非常麻烦的,因为一旦遇到缺少的

  • 问题内容: 给定一个或项,是否有任何(或匹配项的组合)断言每个项都匹配一个? 例如,给定此项目类型: 我想写一个断言,表示s 集合中的所有项目都具有特定值。我在想这样的事情: 没有自己写匹配器,有什么办法吗? 问题答案: 使用匹配器。 Hamcrest还提供了一种快捷方式。 完整的例子