【问题标题】:Hamcrest matcher to compare two arraysHamcrest 匹配器比较两个数组
【发布时间】:2019-01-30 11:32:39
【问题描述】:

我有一个对数组进行排序的方法,我想测试它,我想将它的结果与预期的结果进行比较,当然我可以使用 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));
}

【问题讨论】:

    标签: java arrays testing junit hamcrest


    【解决方案1】:

    数组可以用最简单的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))。

    【讨论】:

      【解决方案2】:

      您可以通过多种方式使用hamcrest 执行此操作。最简单的方法是在Matchers 类中使用arrayContaining 匹配器。

      assertThat(result, Matchers.arrayContaining(expected));
      

      【讨论】:

      • 感谢您的回答,是的,我同意您的看法,Matchers.arrayContaining 检查结果中的对象是否在预期的数组中,但这忽略了我目前正在测试的顺序
      • 如果顺序不同,arrayContaining 匹配器会失败。还有另一个匹配器叫做arrayContainingInAnyOrder,我想这就是你所指的。你试过吗?
      • 谢谢你我在看的是这个IsArrayContainingInOrder.arrayContaining 它也测试了数组的顺序
      • 如果此解决方案有效,请接受答案。谢谢。
      • arrayContaining() 当expected 是原始数组时将无法编译:byte[] result = byte[] { 0x01, 0x02, 0x03 }; byte[] exepected = byte[] { 0x01, 0x02, 0x03 }; assertThat(result, Matches.arrayContaining(expected)) 将抱怨:The method assertThat(T, Matcher&lt;? super T&gt;) in the type MatcherAssert is not applicable for the arguments (byte[], Matcher&lt;byte[][]&gt;)
      【解决方案3】:

      Junit 还有一个内置的assertArrayEquals (https://junit.org/junit4/javadoc/4.12/org/junit/Assert.html#assertArrayEquals(java.lang.Object[],%20java.lang.Object[]))

      如果您的数组包含数组,它会递归检查相等性。非常方便,非常具有声明性且易于阅读!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多