java 关于比较不同类型的Assert:又无聊又无聊

qoefvg9y  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(99)

所以我有这样一段Java代码,它覆盖了一个类的equals:

@Override public boolean equals(Object o) {
    if (o instanceof NumeroSeccion) {
        NumeroSeccion numSec = (NumeroSeccion) o;
        return Arrays.equals(this.valor, numSec.valor);
    } else {
        return false;
    }
}

它基本上遵循了在执行任何其他操作之前检查两个对象是否属于同一类的通用规则。其他人更喜欢使用getClass(),但想法是一样的。
现在我为它写了一些测试,包括:

void notEqualsOtherClass() {
    NumeroSeccion ns1 = new NumeroSeccion("1.2.3.4.5");
    String ns2Str = "1.2.3.4.5";
    assertNotEquals(ns1, ns2Str);
}

根据IntelliJ IDEA的说法,这可能是“多余的”:
可能是多余的Assert:不兼容的类型被比较'NumeroSeccion'和'String'
According to Sonar static code analysis,这是一个“愚蠢的相等检查”:
不应该进行愚蠢的平等检查。不同类型的比较总是返回false。可以简单地删除比较及其所有依赖代码。这包括:比较不相关的类。
它实际上是多余的检查类类型,或者为这种检查添加一个测试,或者所有这些工具都给出了错误的建议?

r1zk6ea1

r1zk6ea11#

警告给出的建议对生产代码有效。测试代码是一种特殊情况,在这种情况下,你故意做错了一些事情来测试一些东西。所以,这个警告是完全合理的,但它恰好不适用于测试代码。
您可以安全地禁止该特定测试代码行中的警告*
或者,您可以使用一种技巧来欺骗编译器(和/或IDE),而不是抑制警告,这样就不会发出警告。例如,您可以执行Object ns2Str = "1.2.3.4.5";,而不是String ns2Str = "1.2.3.4.5";

6tqwzwtp

6tqwzwtp2#

首先,在Object::equals的实现中,使用instanceof和比较Object::getClassthisother是不等价的!

public class Parent {}
public class Child extends Parent {}

final var v1 = new Parent();
final var v2 = new Child();

final var check1 = v2 instanceof Parent; // is true
final var check2 = v2.getClass().equals( v1.getClass() ); // is false
final var check2 = v2.getClass().equals( Parent.class ); // is false

对于equals()的实现,这有很大的不同。通常,在equals()的实现中,应该只对final类使用instanceof
你从你的工具中得到的警告是因为这些工具在你的程序执行之前就已经知道了比较的结果,因此它们假设相应的代码至少是过时的,如果不是错误的话。这些工具并没有研究equals()的实现,但它们假定了一个正确的实现,因此它们还假定NumeroSeccion的示例永远不可能等于String的示例。

相关问题