使用Hamcrest获得多个正确结果(是否有或匹配者?

2022-08-31 12:19:37

我对匹配者比较陌生。我正在玩弄hamcrest与JUnit的组合,我有点喜欢它。

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

类似的东西

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

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

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


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

来自Hamcrest教程

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

另请参阅 Javadoc

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


答案 2

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

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

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

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

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

assertThat(result, isIn(theCollection))

另请参阅 Javadoc


推荐