当前位置: 代码迷 >> java >> ArrayList 和 Arrays.asList() 的 Junit 断言错误
  详细解决方案

ArrayList 和 Arrays.asList() 的 Junit 断言错误

热度:77   发布时间:2023-07-25 19:47:22.0

我有返回对象的 ArrayList 的方法,如下所示 -

public <Range> getAllRanges(List<Range> ranges){
  //Some business logic
  ....
  List<Range> resultRanges = new ArrayList<>();
  .....
  return resultRanges;
}

我正在为此编写 Junit -

@Test
public void someInputTest() {
    final List<Range> ranges = Arrays.asList(new Range(1, 3), new Range(2, 4));
    final List<Range> actual = myCalss.getAllRanges(ranges);
    final List<Range> expected = Arrays.asList(new Range(1, 4));
    assertEquals(expected, actual);
}

但我收到断言错误,例如 -

java.lang.AssertionError: expected: java.util.Arrays$ArrayList<[(1, 4)]> but was: java.util.ArrayList<[(1, 4)]>
....

之后我在测试中尝试了以下代码 -

@Test
public void someInputTest() {
    final List<Range> ranges = Arrays.asList(new Range(1, 3), new Range(2, 4));
    final List<Range> actual = myCalss.getAllRanges(ranges);
    final List<Range> expected = new ArrayList<>();
    expected.add(new Range(1, 4));
    assertEquals(expected, actual);
}

但在那之后我得到 -

java.lang.AssertionError: expected: java.util.ArrayList<[(1, 4)]> but was: java.util.ArrayList<[(1, 4)]>
...

现在预期和实际是机器人相同但仍然断言错误。 我在这里做错了什么。

奇怪的是, Arrays.asList没有覆盖equals ,因此即使它包含与另一个ArrayList类型的列表相同的元素,它们也不会被比较为相等。

一种解决方案是将其包装到ArrayList

assertEquals(new ArrayList<>(Arrays.asList(...)), myArrayList);

我有同样的问题。你应该在你的 class 中添加,它在 list、equals 和 hashcode 中使用。 之后它将起作用。

  相关解决方案