### Question:
AbstractTopic implements Topic { @Override public boolean equals(Object obj) { if (!(obj instanceof AbstractTopic)) return false; AbstractTopic t = (AbstractTopic) obj; return (t.topicLevels.equals(this.topicLevels) && (t.special == this.special)); } protected  AbstractTopic(String topicString); @Override String getStringRepresentation(); @Override List<TopicLevel> getTopicLevels(); @Override boolean isSpecialTopic(); @Override String toString(); @Override int hashCode(); @Override boolean equals(Object obj);  }### Answer:
@Test void testEqualsNot() throws Exception { AbstractTopic t1 = new TestingTopic("home/test"); AbstractTopic t2 = new TestingTopic("Home/Test"); AbstractTopic t3 = new TestingTopic("+/+"); AbstractTopic t4 = new TestingTopic("#"); Assertions.assertFalse(t1.equals(t2), t1 + " and " + t2 + " should not be equal"); Assertions.assertFalse(t1.equals(t3), t1 + " and " + t3 + " should not be equal"); Assertions.assertFalse(t1.equals(t4), t1 + " and " + t4 + " should not be equal"); Assertions.assertFalse(t2.equals(t3), t2 + " and " + t3 + " should not be equal"); Assertions.assertFalse(t2.equals(t4), t2 + " and " + t4 + " should not be equal"); Assertions.assertFalse(t3.equals(t4), t3 + " and " + t4 + " should not be equal"); }
@Test void testEqualsNotSameType() throws Exception { AbstractTopic t1 = new TestingTopic("home/test"); AbstractTopic t2 = new TestingTopic("+/+"); AbstractTopic t3 = new TestingTopic("#"); Assertions.assertFalse(t1.equals(new Object()), t1 + " should not be equal to a empty object."); Assertions.assertFalse(t2.equals(new Object()), t2 + " should not be equal to a empty object."); Assertions.assertFalse(t3.equals(new Object()), t3 + " should not be equal to a empty object."); }