2017-08-27 30 views
-1

所以这是单元测试的一部分:为什么平等的方法是多余的?

public class LocationTester { 

private Floor seventhFloor; 
private int size = 10; 

@Before 
public void setup() { 
    size = 10; 
    seventhFloor = new Floor(7, size); 
} 

@Test 
public void testLocationEquality() { 
    Location l1 = new Location(seventhFloor, 3, 3); 
    Location l2 = new Location(new Floor(7, size), 3, 3); 
    assertTrue(l1.equals(l2)); 
}} 

这里的位置类的部分与equals方法:

class Location { 

private Floor floor; 
private int size, position; 

    @Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (obj == this) { 
     return true; 
    } 
    if (obj instanceof Location) { 
     return false; 
    } 
    return equals((Location) obj); 
} 

public boolean equals(Location loc) { 
    return floor.equals(loc.floor) && position == loc.position && size == loc.size; 
} 

而这里的地板类的部分:

class Floor { 

private int number; 

    public boolean equals(Floor floor) { 
    return number == floor.number; 
} 

我不知道为什么在“位置l2 =新位置(新楼层(7,大小),3,3)”参数(Object obj)和类型转换的等值方法被放在“新位置”时;实际上是位置本身的对象。为什么需要把equals(Object obj)。

测试运行正常,但没有方法equals(Object obj)。

更何况,这个项目中没有Location的子类。那么为什么把类型转换为“返回等于((Location)obj)”;无论如何?

+3

为什么*什么*返回true? 'equals(Object)','equals(Location)'或'equals(Floor)'?请澄清,理想情况下将其降低为[mcve],以便为缺乏清晰度提供更小的范围。 –

+0

请注意,在这个例子中应该有一个编译错误 - 位置的“equals(Location loc)”正在访问对象的专用字段。 –

+3

@JanezKuhar Location中的方法被允许访问Location的私有字段。 – khelwood

回答

1

您的测试实际上只测试equals(Location)方法。它不测试equals(Object)方法。

然而,equals(Object)存在于类以覆盖一个从Object.equals(Object),这需要该参数是任何Object

如果在某些程序,您分配一个Location对象的Object变量:

Object a = new Location(...); 
Object b = new Location(...); 

然后使用a.equals(b),它不会使用该位置的平等的测试,并且将始终返回false,甚至如果这两个实例指定了相同的位置 - 除非您有适当的方法 - 这是您在这里所拥有的。

而在那个equals(Object)方法中,因为它的参数类型为Object,所以如果你没有将它转换为Location,它会自动递归调用它自己。您必须将其转换为最终调用包含实际相等性测试的equals(Location)方法。

事实上,你可以没有equals(Location),只是写在equals(Object)测试,但我想笔者想保存在它是在编译时知道案件三个测试步骤的测试对象是Location

+0

所以如果我有“Object o1 = new Location(sevenFloor,3,3);”在单元测试中,“return equals((Location)obj);”在equals(Object obj)里面会达到目的吗?因为对象o1将被降级为类型位置,我是对吗? – Bob

+0

@Bob如果'l1'或'l2'是'Object'而不是'Location',那么肯定会调用'equals(Object)'方法。您可以将打印添加到该方法并亲自查看。 – RealSkeptic

+0

谢谢。现在我明白了和equals(Object obj)及其施法句的目的。尽管在我的情况下不需要,但这仍然是一个好习惯。 – Bob

相关问题