我尝试了Unitils工具,它真的很棒,但不提供排除字段的选项。这样做的唯一方法是设置null对象并启用IGNORE_DEFAULTS标志,但在我的情况下,这没有帮助,因为我有一些由系统自动生成的id。所以如果我能把这个id添加到一个排除列表中,那就太完美了。我还尝试了Mockito的ReflectionEquals,但它没有帮助,因为我需要一个字段到字段的比较。还有什么有用的吗我找了几个小时都没有找到。在此先谢谢您!
null
IGNORE_DEFAULTS
ReflectionEquals
izkcnapc1#
您可以使用AssertJ解决问题。它可以进行逐个字段的递归比较,并可以根据名称、正则表达式或类型忽略字段。
assertThat(sherlock) .usingRecursiveComparison() .ignoringFields("name", "home.address.street") .isEqualTo(moriarty);
3hvapo4f2#
如果你不喜欢你发现的那些功能,使用java反射来实现你自己的也不会那么难。
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"])
3条答案
按热度按时间izkcnapc1#
您可以使用AssertJ解决问题。它可以进行逐个字段的递归比较,并可以根据名称、正则表达式或类型忽略字段。
3hvapo4f2#
如果你不喜欢你发现的那些功能,使用java反射来实现你自己的也不会那么难。
flseospp3#
我们在groovy中使用自己的方法(类似于Frank Neblung's answer),使用ObjectMapper和属性的filterList将对象转换为格式化的JSON字符串。这对于测试来说非常方便,但也有一些缺点,比如类型信息的丢失。