Java比较复杂对象,不包括JUnit的某些字段

pod7payv  于 2023-10-20  发布在  Java
关注(0)|答案(3)|浏览(90)

我尝试了Unitils工具,它真的很棒,但不提供排除字段的选项。这样做的唯一方法是设置null对象并启用IGNORE_DEFAULTS标志,但在我的情况下,这没有帮助,因为我有一些由系统自动生成的id。所以如果我能把这个id添加到一个排除列表中,那就太完美了。
我还尝试了Mockito的ReflectionEquals,但它没有帮助,因为我需要一个字段到字段的比较。
还有什么有用的吗我找了几个小时都没有找到。
在此先谢谢您!

izkcnapc

izkcnapc1#

您可以使用AssertJ解决问题。它可以进行逐个字段的递归比较,并可以根据名称、正则表达式或类型忽略字段。

assertThat(sherlock)
  .usingRecursiveComparison()
  .ignoringFields("name", "home.address.street")
  .isEqualTo(moriarty);
3hvapo4f

3hvapo4f2#

如果你不喜欢你发现的那些功能,使用java反射来实现你自己的也不会那么难。

flseospp

flseospp3#

我们在groovy中使用自己的方法(类似于Frank Neblung's answer),使用ObjectMapper和属性的filterList将对象转换为格式化的JSON字符串。这对于测试来说非常方便,但也有一些缺点,比如类型信息的丢失。

// interface of the conversion
String nice(Object o, String... filterList) { ... }

// test calls
assertEquals(nice(actual, ["-unusedAttribute", "-unusedAttribute2"]), nice(expected, ["-unusedAttribute", "-unusedAttribute2"]))
assertEquals(nice(actual, ["+usedAttibute", "+usedAttibute2"]), nice(expected, ["+usedAttibute", "+usedAttibute2"]))

// test calls using the spock framework
nice(actual, ["-unusedAttribute", "-unusedAttribute2"]) == nice(expected, ["-unusedAttribute", "-unusedAttribute2"])
nice(actual, ["+usedAttibute", "+usedAttibute2"]) == nice(expected, ["+usedAttibute", "+usedAttibute2"])

相关问题