Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为hashcode、equals和toString方法生成单元测试_Java - Fatal编程技术网

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

Java 为hashcode、equals和toString方法生成单元测试,java,Java,是否有任何工具/库可以自动为我的hashcode和equals方法生成测试,并查看这些方法中涉及的实例变量?toString()不应该有任何需要遵守的“契约”,因此单元测试会很奇怪,也没有用处 您可以查看关于equals()的信息 还有一个JUnit插件 关于同一主题: Guava使用测试生成器测试equals和hashCode您可以使用Apache EqualsBuilder和HashCodeBuilder实现equals和hashCode,从而将不正确执行的风险降至最低 测试equa

是否有任何工具/库可以自动为我的hashcode和equals方法生成测试,并查看这些方法中涉及的实例变量?

toString()
不应该有任何需要遵守的“契约”,因此单元测试会很奇怪,也没有用处

您可以查看关于
equals()
的信息

还有一个JUnit插件


关于同一主题:


Guava使用测试生成器测试
equals
hashCode

您可以使用Apache EqualsBuilder和HashCodeBuilder实现equals和hashCode,从而将不正确执行的风险降至最低

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

是一个很棒的库。我经常将it与库结合起来,自动扫描某些类,并同时测试所有类的契约:

 @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");
      }
    });
  }
@测试
public void validateEqualsHashCodeToString(){
最终反射DToclasseReflections=新反射(新配置生成器()
.setURL(ClasspathHelper.forPackage(“my.base.package”))
.filterInputsBy(新FilterBuilder()
.include(“.*Dto.*”)//包括所有Dto类
.exclude(“.*Test.*”)//从将被扫描的测试中排除类
.设置扫描程序(新子扫描程序(错误));
final Set我建议测试hash码和equals方法

我建议测试toString方法

以下是一个例子:

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

我不明白为什么toString不能有一个规范,尽管我自己从来没有对它进行过单元测试。我并没有说它不能,但它不应该。toString()是对象的字符串表示形式,所以它可以被人读取(请参见javadoc中的object),所以它基本上不应该做任何“极端”的事情(它是对象的表示,而不是业务方法),并且它返回一个由人读取的字符串,而不是解析的字符串。从这里可以很容易地说,
toString
不应该进行单元测试(不是“不能”或“不能”)。是的,如果你要对所有类进行全面测试,那么它就没有意义。请注意,对于特定的类来说,它仍然是合法的。请对
toString
做出更严格的要求。JSE本身有很多例子(
StringWriter
StringBuilder
URL
,…),我倾向于同意(在其他SO帖子中也有这样的争论)但在web开发中,它经常被用作在网页上显示信息的快捷方式,比如说。对于简单的DTO,我想我对这种滥用并没有那么坚决……但最终,我对强制执行“人类可读”的含义没有问题在相关应用程序的上下文中。这是一个相对次要的问题;我只是觉得思考一下很有趣,'因为我从来没有:)@MarkoTopolnik我同意你的观点,有时
toString()
需要有一定的意义,但即使在这种情况下,我也不确定单元测试是否相关。它与测试getter/setter不同,但有点接近。测试本身几乎毫无意义(如果级联在java中起作用,你最终会比测试实际的方法更多地检查)。此类测试没有实质意义,但主要是引入维护。@MPlatvoet我并不完全同意您的看法,测试
equals()
hashcode()
可能很重要,特别是如果您的一些代码严重依赖于此(
HashMap
,涉及继承的平等测试)@Colin Hebert那么,您需要预先编写一个测试,其中规定了一些要求。生成测试只会确认您在编写实现时引入的可能错误。因此,现在,只有在您需要更改实现时,它才成为维护添加。@buymypies我正在使用eclipse@MPlatvoet我同意你的看法h您认为这些测试将复制源代码中的错误。但是通过这种方式,我们可以确保没有人意外地从这些方法中删除变量。问题是,如何测试哈希代码契约是否被破坏。应该如何实现测试,检查以下两件事:1.如果equals返回true,那么hashCode必须返回相同的值。2.如果hashCode返回不同的值,那么equals必须返回false。