繁体   English   中英

为hashcode,equals和toString方法生成单元测试

[英]Generate unit tests for hashcode,equals and toString methods

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

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

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

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

还有一个JUnit Addon EqualsHashCodeTestCase


在同一主题上:

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<Class<?>> 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM