【问题标题】:Multiple correct results with Hamcrest (is there an or-matcher?)Hamcrest 的多个正确结果(是否有或匹配器?)
【发布时间】:2010-09-14 05:47:29
【问题描述】:

我对匹配器比较陌生。我正在玩弄 hamcrest 和 JUnit,我有点喜欢它。

有没有办法说明多项选择中的一个是正确的?

类似

assertThat( result, is( either( 1, or( 2, or( 3 ) ) ) ) ) //does not work in hamcrest

我正在测试的方法返回集合的一个元素。该列表可能包含多个候选者。我当前的实现返回第一个命中,但这不是必需的。如果返回任何可能的候选人,我希望我的测试用例成功。你会如何用 Java 来表达这一点?

(我对 hamcrest-alternatives 持开放态度)

【问题讨论】:

    标签: java junit hamcrest matcher


    【解决方案1】:
    assertThat(result, anyOf(equalTo(1), equalTo(2), equalTo(3)))
    

    来自Hamcrest tutorial

    anyOf - 如果有任何匹配器匹配,则匹配,短路(如 Java ||)

    另见Javadoc

    此外,您可以编写自己的 Matcher,这很容易做到。

    【讨论】:

    【解决方案2】:

    marcos 是对的,但您还有其他几个选择。首先,一个非此即彼的:

    assertThat(result, either(is(1)).or(is(2)));
    

    但如果你有两个以上的项目,它可能会变得笨拙。另外,类型检查器有时会在这样的事情上变得奇怪。对于您的情况,您可以这样做:

    assertThat(result, isOneOf(1, 2, 3))
    

    或者如果您已经在数组/集合中有选项:

    assertThat(result, isIn(theCollection))
    

    另见Javadoc

    【讨论】:

    • 嗯...由于某些莫名其妙的原因,我的 Eclipse 环境(只有大约 6 个月大)有一个古老的 Hamcrest 库,我没有得到这些好东西。
    • 好吧,assertThat((Set<String>)null, is(either(empty()).or(nullValue()))); 给了我一个相当奇怪的断言错误:Expected: is (an empty collection or null) but: was null for hamcrest 1.3...
    • isOneOf() 现在似乎已被弃用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多