JUnit hamcrest 长比较

JUnit hamcrest Long comparison

我有以下测试代码:

Page<Long> users = userService.findAllUserIdsWithLocationsWithoutCategories(pageable);
assertEquals(1, users.getTotalElements());
assertThat(users.getContent(), hasSize(1));
assertThat(users.getContent(), containsInAnyOrder(user5.getId()));

但失败并出现以下错误:

java.lang.AssertionError: 
Expected: iterable with items [<132L>] in any order
     but: not matched: <132>

我做错了什么以及如何解决?

实际 return 类型

您正在 return 调用 getContent()Page<Long>. This will return a List<Long> as the docs 状态:

List<T> getContent()

Returns the page content as List.

合适的匹配器

因此您可以使用 HamcrestMatchers for Collections。 我会使用 hasItem() 检查列表中是否包含一项(例如 user5.getId())。

匹配相同类型

但要注意传递给 hasItem() 的参数类型。 expected 值应该是 Longlong 类型(自动装箱),因为 actual 元素 List<Long> 类型为 Long.

你的论点 return 类型是什么 user5.getId()

错误消息显示您需要 intInteger(因为 Long 缺少 L):

not matched: <132>

而您的列表 returns Long 的元素(因此在错误消息中添加后缀 L):

iterable with items [<132L>]

解决方案:铸造或重新设计

您可以将预期的 getId() 转换为所需的类型 LongassertThat(users.getContent(), containsInAnyOrder( (Long) user5.getId() ));

或者你勇敢地把被测方法重新设计成returnPage<Integer>。背后的合理性:由于大多数 ID 被实现为 Integer(参见 user5.getId())所有相关方法(如 findAllUserIdsWithLocationsWithoutCategories)应该在其签名中尊重该类型并且 return Integers。