Hamcrest的多个正确结果(是否有匹配器?)


76

我对匹配者来说还比较陌生。我正在和JUnit一起使用hamcrest玩弄,我有点喜欢。

有没有办法指出多个选择之一是正确的?

就像是

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

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

(我接受hamcrest替代方案)

Answers:


116
assertThat(result, anyOf(equalTo(1), equalTo(2), equalTo(3)))

Hamcrest教程

anyOf-如果匹配器匹配,则匹配,发生短路(例如Java ||)

另请参阅Javadoc

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


81

marcos是正确的,但您还有其他几种选择。首先,有一个非此即彼/或:

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

但是如果您有两个以上的项目,则可能会变得笨拙。另外,有时候类型检查器在诸如此类的事情上变得很奇怪。对于您的情况,您可以执行以下操作:

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

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

assertThat(result, isIn(theCollection))

另请参阅Javadoc


嗯...出于某些无法解释的原因,我的Eclipse环境(大约只有6个月大)有一个古老的Hamcrest库,我没有得到这些东西。
CurtainDog 2012年

好吧,assertThat((Set<String>)null, is(either(empty()).or(nullValue())));给了我一个很奇怪的断言错误:Expected: is (an empty collection or null) but: was nullhamcrest 1.3...
Jezor

isOneOf()现在似乎已被弃用。
哈尔塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.