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.
合适的匹配器
因此您可以使用 Hamcrest 的 Matchers for Collections。
我会使用 hasItem()
检查列表中是否包含一项(例如 user5.getId()
)。
匹配相同类型
但要注意传递给 hasItem()
的参数类型。 expected 值应该是 Long
或 long
类型(自动装箱),因为 actual 元素 List<Long>
类型为 Long
.
你的论点 return 类型是什么 user5.getId()
?
错误消息显示您需要 int
或 Integer
(因为 Long 缺少 L
):
not matched: <132>
而您的列表 returns Long
的元素(因此在错误消息中添加后缀 L
):
iterable with items [<132L>]
解决方案:铸造或重新设计
您可以将预期的 getId()
转换为所需的类型 Long
:
assertThat(users.getContent(), containsInAnyOrder( (Long) user5.getId() ));
或者你勇敢地把被测方法重新设计成returnPage<Integer>
。背后的合理性:由于大多数 ID 被实现为 Integer
(参见 user5.getId()
)所有相关方法(如 findAllUserIdsWithLocationsWithoutCategories
)应该在其签名中尊重该类型并且 return Integer
s。
我有以下测试代码:
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.
合适的匹配器
因此您可以使用 Hamcrest 的 Matchers for Collections。
我会使用 hasItem()
检查列表中是否包含一项(例如 user5.getId()
)。
匹配相同类型
但要注意传递给 hasItem()
的参数类型。 expected 值应该是 Long
或 long
类型(自动装箱),因为 actual 元素 List<Long>
类型为 Long
.
你的论点 return 类型是什么 user5.getId()
?
错误消息显示您需要 int
或 Integer
(因为 Long 缺少 L
):
not matched: <132>
而您的列表 returns Long
的元素(因此在错误消息中添加后缀 L
):
iterable with items [<132L>]
解决方案:铸造或重新设计
您可以将预期的 getId()
转换为所需的类型 Long
:
assertThat(users.getContent(), containsInAnyOrder( (Long) user5.getId() ));
或者你勇敢地把被测方法重新设计成returnPage<Integer>
。背后的合理性:由于大多数 ID 被实现为 Integer
(参见 user5.getId()
)所有相关方法(如 findAllUserIdsWithLocationsWithoutCategories
)应该在其签名中尊重该类型并且 return Integer
s。