为hashcode,equals和toString方法生成unit testing

是否有任何工具/库可以自动生成我的哈希码的测试,并等于查看这些方法中涉及的实例变量的方法?

Guava使用此测试构建器来测试equalshashCode

toString()不应该有任何“契约”要尊重,所以unit testing它会很奇怪而且没用。

你可以看看有关equals()这个项目 。

还有一个JUnit Addon EqualsHashCodeTestCase


在同一主题上:

  • 我该怎么做unit testinghashCode函数?
  • 一个单元应该如何测试hashCode-equals合约?

EqualsVerifier是一个很棒的库。 我经常将它与Reflections库结合使用,以自动扫描某些类并立即测试所有类的合同:

  @Test public void validateEqualsHashCodeToString() { final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder() .setUrls(ClasspathHelper.forPackage("my.base.package")) .filterInputsBy(new FilterBuilder() .include(".*Dto.*") // include all Dto classes .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well .setScanners(new SubTypesScanner(false))); final Set> allDtoClasses = dtoClassesReflections.getSubTypesOf(Object.class); allDtoClasses.forEach(dtoClass -> { logger.info("equals/hashCode tester testing: " + dtoClass); EqualsVerifier.forClass(dtoClass).verify(); try { dtoClass.getDeclaredMethod("toString"); } catch (NoSuchMethodException e) { fail(dtoClass + " does not override toString() method"); } }); } 

我建议使用EqualsVerifier来测试哈希码和equals方法。

我建议使用ToStringVerifier来测试toString方法

这是一个例子:

 @Test public void testToString() { ToStringVerifier.forClass(User.class).verify(); } 

您可以使用Apache EqualsBuilder和HashCodeBuilder来实现equals和hashCode,从而最大限度地降低未正确执行的风险。

测试equals很简单,创建两个实例值相同的实例(通过它们可以使它们相等)并在一个实例上调用equals将另一个作为参数传递,你应该期望它返回true:D