【问题标题】:Comparing Lists of User-defined objects in JUnit比较 JUnit 中用户定义对象的列表
【发布时间】:2019-02-18 01:31:22
【问题描述】:

我知道以前有人问过这个问题。但是,没有一个解决方案对我有用。 我有一个用户定义的类,它是 3 个类的组合。 它看起来像这样:

Class compositeClass
{
UserDefinedClass1 useClass1;
UserDefinedClass2 useClass2;
UserDefinedClass3 useClass3;
}

我有一个测试方法,我需要比较这些复合类的列表。 我尝试了 Assert equals 的几种变体,如下所示: 汉克雷斯特:

Assert.assertThat(mockCompositeList().getStandardLoadComposites(), 
                    equalTo(closeRequest.getStandardLoadComposites()));

Assert.assertArrayEquals(mockCompositeList().getStandardLoadComposites().toArray(), 
                closeRequest.getStandardLoadComposites().toArray());

两个实例都返回这个 AssertionError:

预期为 但为

它似乎是在比较引用而不是对象中的值。 我是否必须重写 equals 运算符才能让它比较用户定义对象的对象中的值?

【问题讨论】:

  • Hamcrest 方法(来自stackoverflow.com/questions/33840531/…)是您之前尝试过的一些方法吗?
  • 如果您确实尝试过(例如) containsInAnyOrder,什么不起作用(即,他们的结果与您的预期有何不同)。另外,你能确认你在你的类中覆盖了 equals() 和 hashcode() 吗?
  • 抱歉 - 我刚刚重读了:Do I have to override the equals operator to get it to compare the values in the objects of the user defined objects? 是的,你必须重写 equals() - 并且每当你重写 equals() 时,你也应该重写 hashcode() (见 @987654322 @)

标签: junit junit4 hamcrest


【解决方案1】:

考虑比较列表中的对象,而不是比较列表本身。我假设您已经创建了一个模拟列表,以断言预期结果和实际结果(列表),您要测试的方法将使用 新。 无论如何,这个 equals 方法将比较三个对象的 id,如果被覆盖则返回 true。但是考虑覆盖你的 equals 和 hash 方法只是为了让你的断言正常工作。

两个列表不必是同一个列表。但是您创建并传递给您的类的模拟对象在某个时间点后不应更改。如果这是您要在测试中确定的内容,则比较列表中的对象会为你做的。

【讨论】:

    【解决方案2】:

    感谢您的回复。 我所做的是创建一个比较列表中的值的辅助方法。当类中只设置了 3 个值时,要覆盖复合类的等于运算符将是很多工作。因此,我比较了列表中每个对象的值,并根据比较返回真/假。然后使用assert中的方法equals和boolean比较。

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多