Truth.assertThat.contains与List.containsAll行为差异及验证方案疑问
问题分析与解决方案
为什么Truth的contains方法不生效?
你用错了Truth的API——assertThat(列表).contains(另一个列表)这个写法,是在检查传入的整个列表对象是否作为单个元素存在于目标列表中,而不是检查目标列表包含另一个列表的所有元素。这和List.containsAll()的逻辑完全不一样,自然验证失败。
用Truth实现正确验证的方式
要实现和containsAll()等价的验证,同时获得Truth提供的详细错误提示,应该用这些API:
- 如果只需要验证目标列表包含所有预期元素(不关心顺序和重复):
或者更简洁的:assertThat(getItemsByChannelId).containsAllOf(entitiesChannelAPage2.toArray());assertThat(getItemsByChannelId).containsAtLeastElementsIn(entitiesChannelAPage2); - 如果需要严格验证两个列表的元素完全一致(包括顺序、数量,适合确认元素没被修改/删除):
这个方法会在元素缺失、多了额外元素、顺序不对时,给出非常明确的错误信息,比如指出哪个元素找不到,或者多了哪些元素。assertThat(getItemsByChannelId).containsExactlyElementsIn(entitiesChannelAPage2).inOrder();
关键注意点
不管用哪种验证方式,都要确保你的数据类正确重写了equals()和hashCode()方法——这是集合元素比较的基础。如果没重写,即使元素内容完全一致,也会被判定为不同对象,导致验证失败。
内容的提问来源于stack exchange,提问作者Bitwise DEVS
相关产品推荐
相关产品推荐

