我有一个对数组进行排序的方法,我想对其进行测试,我想将其结果与预期的结果进行比较,当然我可以使用for循环来完成它,但是我要问是否有是Hamcrest匹配器进行比较
我上课
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;
if (((Person) obj).budget == budget && ((Person) obj).age == age && ((Person) obj).name.equals(name)) {
return true;
}
return false;
}
}
我的测试方法就是这样
@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);
//want to compare the content of the two arrays result and expected; using assertThat
}
使用Hamcrest可以做到吗?如果是,怎么办?
更新
是的,可以使用IsArrayContainingInOrder.arrayContaining
....
assertThat(expected, IsArrayContainingInOrder.arrayContaining((new InsertionSort().sort(persons, Comparator.comparingDouble(o -> o.budget)))));
assertThat(3,is((new InsertionSort().sort(persons, Comparator.comparingDouble(o -> o.budget))).length));
}
答案 0 :(得分:3)
可以将数组与最简单的is
匹配器进行匹配,例如:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
// ...
assertThat(result, is(new byte[]{1, 2, 3}));
在幕后,它将发现输入是一个数组。它将为数组使用适当的匹配器(即不只是a.equal(b)
)。
答案 1 :(得分:2)
hamcrest
可以通过多种方式实现。最简单的方法是在arrayContaining
类中使用Matchers
匹配器。
assertThat(result, Matchers.arrayContaining(expected));
答案 2 :(得分:0)
Junit 也有一个内置的 assertArrayEquals
( https://junit.org/junit4/javadoc/4.12/org/junit/Assert.html#assertArrayEquals(java.lang.Object[],%20java.lang.Object[]) )
如果您的数组包含数组,它会递归地检查相等性。非常方便,而且非常具有声明性且易于阅读!