{"record":{"id":"a1075e9889befd22","repo":"google/guava","slug":"item-must-not-be-relationship-to-other","errorCode":null,"errorMessage":"$ITEM must not be $RELATIONSHIP to $OTHER","messagePattern":"\\$ITEM must not be \\$RELATIONSHIP to \\$OTHER","errorType":"exception","errorClass":"AssertionFailedError","httpStatus":null,"severity":"error","filePath":"android/guava-testlib/src/com/google/common/testing/RelationshipTester.java","lineNumber":141,"sourceCode":"        relatedInfo,\n        itemHash == relatedHash);\n  }\n\n  private void assertUnrelated(\n      int groupNumber, int itemNumber, int unrelatedGroupNumber, int unrelatedItemNumber) {\n    Item<T> itemInfo = getItem(groupNumber, itemNumber);\n    Item<T> unrelatedInfo = getItem(unrelatedGroupNumber, unrelatedItemNumber);\n\n    assertWithTemplate(\n        \"$ITEM must not be $RELATIONSHIP to $OTHER\",\n        itemInfo,\n        unrelatedInfo,\n        !equivalence.equivalent(itemInfo.value, unrelatedInfo.value));\n  }\n\n  private void assertWithTemplate(String template, Item<T> item, Item<T> other, boolean condition) {\n    if (!condition) {\n      throw new AssertionFailedError(\n          template\n              .replace(\"$RELATIONSHIP\", relationshipName)\n              .replace(\"$HASH\", hashName)\n              .replace(\"$ITEM\", itemReporter.reportItem(item))\n              .replace(\"$OTHER\", itemReporter.reportItem(other)));\n    }\n  }\n\n  private Item<T> getItem(int groupNumber, int itemNumber) {\n    return new Item<>(groups.get(groupNumber).get(itemNumber), groupNumber, itemNumber);\n  }\n\n  static final class Item<T> {\n    final T value;\n    final int groupNumber;\n    final int itemNumber;\n\n    Item(T value, int groupNumber, int itemNumber) {","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/google/guava/blob/94f39958baf7ad51ddf9c70e406ed6b188194daa/android/guava-testlib/src/com/google/common/testing/RelationshipTester.java#L123-L159","documentation":"RelationshipTester (used by EqualsTester) requires that items placed in different equality groups are NOT equivalent. assertUnrelated() checks equivalence.equivalent(item, unrelated) and throws AssertionFailedError when two cross-group items test as equal — this is a direct violation of the equals/hashCode contract as expressed by the declared grouping.","triggerScenarios":"new EqualsTester().addEqualityGroup(a1).addEqualityGroup(b1).testEquals() where a1.equals(b1) returns true (or an Equivalence wrapped via RelationshipTester reports them equivalent). The tester treats groups as mutually unrelated.","commonSituations":"equals() compares too few fields (so distinct objects compare equal); using only hashCode for equality; objects in different groups that happen to represent the same logical value; grouping mistakes where equal objects were put in separate groups.","solutions":["Fix equals()/hashCode() so objects differing in the relevant fields return false.","Move genuinely-equal objects into the same equality group (the whole point of groups is to separate unequal clusters).","Ensure objects in different groups differ in at least one field that equals() consults.","If using a custom Equivalence, confirm it reflects the intended distinctness."],"exampleFix":"// before\n@Override public boolean equals(Object o) {\n  return o instanceof Key; // ignores id -> cross-group items match\n}\n\n// after\n@Override public boolean equals(Object o) {\n  return o instanceof Key && ((Key) o).id == this.id;\n}","handlingStrategy":"validation","validationCode":"// Sanity-check your grouping by hand before handing it to EqualsTester:\n// all items within a group must be equal; items in different groups must differ.\nfor (Object a : groupX) for (Object b : groupY) {\n  if (a.equals(b)) throw new IllegalStateException(\"cross-group equality: \" + a);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure equals()/hashCode() use all fields that define logical identity.","Place genuinely equal objects in the same group; use new groups only for distinct clusters.","Never implement equals() on hashCode() alone.","When using a custom Equivalence, verify it agrees with the grouping."],"tags":["guava","testing","equals","contract","relationship-tester"],"backgroundTag":null,"analyzedSha":"94f39958baf7ad51ddf9c70e406ed6b188194daa","analyzedAt":"2026-08-13T22:50:30.265Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}