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

eyh26e7m  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(123)

我对matchers比较陌生。我正在摆弄hamcrest和JUnit的组合,我有点喜欢它。
有没有一种方法,来说明多个选择中的一个是正确的?
比如

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

我正在测试的方法返回集合中的一个元素。列表可能包含多个候选元素。我当前的实现返回第一个命中,但这不是必需的。如果返回了任何可能的候选元素,我希望我的测试用例成功。您将如何用Java表达这一点?
(我对火腿肠替代品持开放态度)

jmo0nnb3

jmo0nnb31#

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

来自Hamcrest教程:
anyOf-如果任何匹配器匹配则匹配,短路(如Java||)
另请参阅Javadoc
此外,您还可以编写自己的Matcher,这很容易做到。

mv1qrgav

mv1qrgav2#

马科斯是对的,但你也有一些其他的选择。首先,有一个非此即彼的选择:

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

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

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

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

assertThat(result, isIn(theCollection))

另请参阅Javadoc

tcomlyy6

tcomlyy63#

除了anyOf之外,您还可以选择任一选项,但它的语法略有不同:

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

相关问题