如何使用Hamcrest匹配器比较排序后的自定义对象数组?
使用Hamcrest对比自定义对象数组的排序结果
当然可以用Hamcrest来实现这个需求,而且相比手动写for循环要简洁优雅得多!
核心思路
Hamcrest提供了IsArrayContainingInOrder.arrayContaining匹配器,它能按顺序断言数组中的每个元素与预期元素相等——刚好契合你对比排序结果的场景。值得庆幸的是,你的Person类已经正确重写了equals方法,这是匹配器能准确比较对象的关键前提。
修改后的测试代码
import org.hamcrest.MatcherAssert; import org.hamcrest.collection.IsArrayContainingInOrder; import org.hamcrest.core.Is; import org.junit.Test; import java.util.Comparator; public class SortTest { @Test public void InsertionSortOfObjectUsingComparator() { Person p1 = new Person("A", 18, 800); Person p2 = new Person("K", 15, 1800); Person p3 = new Person("L", 18, 600); Person[] persons = {p1,p2,p3}; Person[] expected = {p3, p1, p2}; Person[] result = (new Sort()).sort(persons, Comparator.<Person>comparingDouble(o-> o.budget)); // 断言结果数组与预期数组按顺序完全匹配 MatcherAssert.assertThat(result, IsArrayContainingInOrder.arrayContaining(expected)); // 额外断言数组长度(可选,确保无元素丢失或冗余) MatcherAssert.assertThat(result.length, Is.is(3)); } } // 你的Person类(已正确重写equals) class Person{ String name; int age; double budget; Person(String name,int age,double budget){ this.name = name; this.age = age; this.budget = budget; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Person)) return false; Person p = (Person) obj; return p.budget == budget && p.age == age && p.name.equals(name); } }
关键细节说明
arrayContaining匹配器会逐个对比数组元素:它会检查实际数组每个位置的元素,是否与预期数组对应位置的元素通过equals方法判定相等。- 若觉得类名冗长,可通过静态导入简化代码:
简化后断言部分可写成:import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsArrayContainingInOrder.arrayContaining; import static org.hamcrest.core.Is.is;assertThat(result, arrayContaining(expected)); assertThat(result.length, is(3)); - 务必保证
Person类的equals逻辑正确:这是对象比较的基础,你当前的实现已经覆盖了所有属性的对比,完全满足需求。
内容的提问来源于stack exchange,提问作者octopus
相关产品推荐
相关产品推荐

