【问题标题】:How to write a JUnit test to compare the equality of 2 lists of objects?如何编写 JUnit 测试来比较 2 个对象列表的相等性?
【发布时间】:2018-08-01 13:42:32
【问题描述】:

我编写了以下 JUnit 测试,但它失败了,因为我的测试是比较对象引用而不是对象值:

public class ListSerializerTest {

  private InputStream iStream;
  private ByteArrayOutputStream oStream;

  @Before
  public void init() {
    oStream = new ByteArrayOutputStream();
  }

  List<Position> serialzeAndDeserializeObject(List<Position> positionList) {
    Stream<Position> positionListStream = positionList.stream();
    OutputStreamUtil.<Position> serializeObjectsFromStream(positionList.size(), positionListStream,
        oStream, PositionSerializer::serialize);
    iStream = new ByteArrayInputStream(oStream.toByteArray());
    List<Position> deserializedPositionList = new ArrayList<>();
    Consumer<Position> PositionListConsumer = position -> deserializedPositionList.add(position);
    InputStreamUtil.<Position> deserializeObjectsToConsumer(iStream, PositionListConsumer,
        PositionSerializer::deserialize);
    return deserializedPositionList;
  }

  @Test
  public void Equals_equal() {
    List<Position> positionList = new ArrayList<Position>();
    for (int i = 0; i < 10; i++) {
      double x = Math.random();
      double y = Math.random();
      Position positionObject = new Position(x, y);
      positionList.add(positionObject);
    }
    List<Position> deserializedPositionList = serialzeAndDeserializeObject(positionList);
    assertThat(deserializedPositionList).isEqualTo(positionList);
  }
}

如何让它比较对象值而不是对象引用?

【问题讨论】:

    标签: java list object junit


    【解决方案1】:

    您很可能在Position 类中缺少正确的hashCode()equals()。你需要这样的测试:

    Position a = new Position(1d, 1d);
    Position b = new Position(1d, 1d);
    assertThat(a).isEqualTo(b);
    

    您对断言的假设不正确,您的测试没有使用引用进行比较。在 AssertJ 中的isEqualTo() 方法:

    assertThat(deserializedPositionList).isEqualTo(positionList);
    

    验证实际值是否等于给定值。

    这是通过在后台调用ArrayList.equals() 方法来执行的。要通过参考比较列表,请使用isSameAs()

    assertThat(deserializedPositionList).isSameAs(positionList);
    

    验证实际值是否与给定值相同,即使用 == 比较

    使用== 运算符执行检查,如deserializedPositionList == positionList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-13
      • 2018-12-12
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      相关资源
      最近更新 更多