java - 使用 hamcrest 匹配器进行 jUnit 测试 - 如何测试集合的大小。

标签 java unit-testing junit matcher hamcrest

在使用 JUnit/hamcrest 进行单元测试时是否存在特定的 api 来检查集合的大小。

目前我正在做 -

Set<String> result = program.getCollection("inputdata");
assertThat(3, is(result.size()) );

以上内容是否可以接受,或者我应该使用 iterableWithSize ,如下所示

assertThat(result, iterableWithSize(3));

什么应该是标准方法,或者两种方法都可以。

最佳答案

assertThat的方法签名是:

<T> void assertThat(T actual, Matcher<? super T> matcher)

地点:

  • 实际是正在比较的计算值
  • matcher 是一个表达式,由 {@link Matcher} 构建,指定允许的值

所以,它的意思是:

assert that this computed value matches that expected value

鉴于此,您问题中的断言:

Set<String> result = program.getCollection("inputdata");
assertThat(3, is(result.size()) );

应表示为:

    assertThat(result.size(), is(3));

这是一个微妙的差异,但它更符合 assertThat 的签名和 Hamcrest 匹配器的规范。

您的问题的其余部分涉及是否应该使用 is 还是 iterableWithSize。以下所有断言都是(a)功能等效并且(b)非常可读(恕我直言)。

assertThat(result.size(), is(3));
assertThat(result, iterableOfSize(3));
assertThat(result, hasSize(3));

没有令人信服的理由(除了主观意见之外)选择其中一个而不是其他任何一个。我建议选择一种方法并始终如一地使用它,因为“一致性原则”应该比正确性更受青睐,因为它们都同样正确。

关于java - 使用 hamcrest 匹配器进行 jUnit 测试 - 如何测试集合的大小。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413584/

相关文章:

java - Hibernate Criteria : nested exception is org. hibernate.QueryException:无法解析属性:

java - opencv编辑图像使文字更清晰

java - 线程 : How do I know which thread a method runs in?

javascript - Angular 单元测试 : Uncaught Error: Uncaught (in promise): Error: Cannot match any routes. URL 段: 'logout'

在嵌入式 Jetty 上使用 javax.websocket 进行 JUnit 测试抛出 RejectedExecutionException : NonBlockingThread

java - 如何测试/模拟这个静态工厂(用于图形构建)?

java - 具有多模块项目的 JUnit 类别 - 无法加载类别

node.js - 使用 jest 的 websocket 服务器 "ws"库的单元测试用例

java - PowerMockito 类转换异常

java - 如何在 junit 中运行所有测试