是否有任何工具/库可以自动生成我的哈希码的测试,并且等于查看这些方法中涉及的实例变量的方法?
答案 0 :(得分:6)
Guava使用this测试构建器来测试equals
和hashCode
。
答案 1 :(得分:3)
toString()
不应该尊重任何“合同”,因此进行单元测试会很奇怪而且无用。
您可以查看有关equals()
的此project。
还有一个JUnit插件EqualsHashCodeTestCase
关于同一主题:
答案 2 :(得分:2)
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");
}
});
}
答案 3 :(得分:1)
我建议使用EqualsVerifier测试哈希码和equals方法。
我建议使用ToStringVerifier测试toString方法
这里是一个例子:
@Test
public void testToString()
{
ToStringVerifier.forClass(User.class).verify();
}
答案 4 :(得分:-1)
您可以使用Apache EqualsBuilder和HashCodeBuilder来实现equals和hashCode,从而最大程度地降低未正确执行的风险。
测试equals很简单,创建两个实例值相同的实例(通过它们可以使它们相等)并在一个实例上调用equals传递另一个作为参数,你应该期望它返回true:D