我用Java制作了这两个类,我需要像这样定义我的结构:
class UnitType {
Position myPos;
public Position getPosition() {
return myPos;
}
}
class Unit extends UnitType {
Position myPos;
public Unit(Position myPos) {
this.myPos = myPos;
}
}
我的问题,我可以这样做:
class UnitTest {
private Unit testUnit;
@Before
public void setUp() {
testUnit = new Unit(new Position(1,0));
}
@Test
public void testPositionUnit() {
assertEquals("Unit should be placed at (1,0)", new Position(1,0), testUnit.getPosition());
}
}
如果我能做到这一点,如果我更新了Unit类中的位置会发生什么。调用getPosition()时,我会查看错误的指针吗?
很多人想知道我的位置类的.equals方法,所以这里是:https://pastebin.com/Tfer1kqR
答案 0 :(得分:4)
如果您这样做,您将hiding超级myPos
的{{1}}字段。例如:
UnitType
然后,即使您可以更新Unit u = new Unit(new Position(1, 0));
System.out.println(u.myPos); // (1, 0) assuming toString() was overriden
System.out.println(u.getPosition()); // null
UnitType ut = u;
System.out.println(ut.myPos); // null
课程的myPos
字段,Unit
总是返回getPosition()
,因为它会返回超类中的null
字段,该字段从未设置过。
此外,如果您想确定两个myPos
对象是否相同,请确保实施Position
(以及.equals()
)。
答案 1 :(得分:1)
要确保您正在查看正确的位置,请通过super constructor
设置位置class UnitType {
Position myPos; // This could be private final.
// Only needed for backwards compatibility if you do new UnitType().
UnitType() { this(null); } // this(...) delegates to another constructor.
// sets the position field.
UnitType(Position myPos) { this.myPos = myPos; }
public void getPosition() {
return myPos;
}
}
class Unit extends UnitType {
// No field definition here that masks the super-class one.
public Unit(Position myPos) {
super(myPos); // Invoke UnitType(Position) to set the field
}
}
然后让单元测试工作,确保Position
类覆盖equals(Object)
,以便assertEquals
测试等效性,而不是检查它们是否是同一个对象。< / p>
答案 2 :(得分:0)
首先,方法getPosition()
必须返回一些内容。在您的代码中它不返回任何内容,因为您已使用返回类型void
其次,根据您正在使用的Position
类(自己的类?,几何位置?,...),您可能需要根据需要覆盖/编写equals(Object o)
方法实现。
通常testUnit.getPosition()
和new Position(..)
不会返回相同的对象(尽管它们可能包含相同的值),从而使断言成为错误。