【问题标题】:How to assert a generic list of integers with Hamcrest?如何用 Hamcrest 断言一个通用的整数列表?
【发布时间】:2012-12-14 12:13:09
【问题描述】:

我正在尝试将整数列表与 Hamcrest 进行匹配,在线查看了一些示例,但是我遇到了运行时异常。

请告诉我正确的语法是什么?

List<Integer> numbers = Arrays.asList( 1, 2, 3, 4, 5 );
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(1))));
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(2))));
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(3))));
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(4))));
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(5))));

谢谢

【问题讨论】:

  • 你想准确断言什么?
  • 我不知道 Hamcrest,但这看起来你希望 java.lang.Integer 有一个属性“值”(它没有)。

标签: java testing junit matching hamcrest


【解决方案1】:

如果列表项的顺序无关紧要:

assertThat(numbers, hasItems(1, 2, 3, 4, 5));

如果是这样:

assertThat(numbers, is(equalTo(Arrays.asList(1, 2, 3, 4, 5))));

如果集合不应该包含其他元素,那么还要检查大小:

assertThat(numbers, hasSize(5));

【讨论】:

  • 如果您想测试numbers 仅包含特定的一组项目,除了执行此处描述的hasItems 断言之外,请务必断言列表的大小。
  • @pholser 这是个好建议,我将其包含在答案中。谢谢。
  • 还有其他匹配器可以结合检查大小和元素 - 请参阅我的答案。
【解决方案2】:

验证集合是否包含特定项目:

assertThat(numbers, hasItem(3));

验证集合是否包含多个项目:

assertThat(numbers, hasItems(3, 4));

要验证集合是否包含完全特定的项目:

assertThat(numbers, contains(1, 2, 3, 4, 5))

验证集合是否包含特定项目,而不用担心顺序:

assertThat(numbers, containsInAnyOrder(5, 4, 3, 1, 2))

【讨论】:

    【解决方案3】:

    随便用

    assertThat(numbers, hasItem(1));
    ...
    

    或者

    assertThat(numbers, hasItems(1, 2, 3, 4, 5));
    

    这里的顺序无关紧要。

    【讨论】:

    • @user465374:导入静态 org.hamcrest.MatcherAssert.assertThat;导入静态 org.hamcrest.Matchers.hasItem;导入静态 org.hamcrest.Matchers.hasItems;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多