用户定义对象序列化的 Junit 测试失败
Junit test failed for user-defined object Serialization
在运行一个用户定义对象序列化的Junit测试之后,它失败了并给了我结果
预计:com.me.Position@7a92922
实际:com.me.Position@25618e91
我定义了以下内容class
public class Position {
private double x;
private double y;
/**
* default constructor
*/
public Position() {
}
/**
* paramterized constructor
*
* @param x
* x-coordinate
* @param y
* y-coordinate
*/
public Position(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
然后我定义了另一个 class 来序列化和反序列化一个 Position 对象,它是前一个 class 的实例,如下
public class PositionSerializer {
static void serialize(Position position, OutputStream outputStream) {
OutputStreamUtil.serializeDouble(position.getX(), outputStream);
OutputStreamUtil.serializeDouble(position.getY(), outputStream);
}
static Position deserialize(InputStream inputStream) {
double x = InputStreamUtil.deserializeDouble(inputStream);
double y = InputStreamUtil.deserializeDouble(inputStream);
Position positionObject = new Position();
positionObject.setX(x);
positionObject.setY(y);
return positionObject;
}
}
最后写了一个单元测试如下
public class PositionSerializerTest {
private InputStream iStream;
private ByteArrayOutputStream oStream;
@Before
public void init() {
oStream = new ByteArrayOutputStream();
}
Position serialzeAndDeserializeObject(Position positionObject) {
PositionSerializer.serialize(positionObject, oStream);
iStream = new ByteArrayInputStream(oStream.toByteArray());
return PositionSerializer.deserialize(iStream);
}
@Test
public void equals_equal() {
Position positionObject = new Position(5.5, 10.5);
Position deserializedPosition = serialzeAndDeserializeObject(positionObject);
assertThat(deserializedPosition).isEqualTo(positionObject);
}
}
怎么了?以及如何解决?
没有问题,但是你在反序列化方法中创建了一个新实例:
Position positionObject = new Position();
这将始终调用位置对象的新实例,因此您无法使用 == 运算符对其进行比较
您应该重写 equals 方法,如下所示:
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof Position)) {
return false;
}
Position otherObject = (Position)o;
if(this.x == otherObject.x && this.y == otherObject.y)
return true;
else return false;
}
然后调用:
assertThat(deserializedPosition).isEqualTo(positionObject);
您正在检查不相等的引用相等性,因为您的反序列化方法 returns 每次调用都会有新实例,请使用下面的值进行比较:
assertThat(deserializedPosition.getX()).isEqualTo(positionObject.getX())
assertThat(deserializedPosition.getY()).isEqualTo(positionObject.getY())
您的测试似乎是在比较对象引用而不是对象值。覆盖 equals 函数或分别比较位置对象中的每个值。
在运行一个用户定义对象序列化的Junit测试之后,它失败了并给了我结果
预计:com.me.Position@7a92922
实际:com.me.Position@25618e91
我定义了以下内容class
public class Position {
private double x;
private double y;
/**
* default constructor
*/
public Position() {
}
/**
* paramterized constructor
*
* @param x
* x-coordinate
* @param y
* y-coordinate
*/
public Position(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
然后我定义了另一个 class 来序列化和反序列化一个 Position 对象,它是前一个 class 的实例,如下
public class PositionSerializer {
static void serialize(Position position, OutputStream outputStream) {
OutputStreamUtil.serializeDouble(position.getX(), outputStream);
OutputStreamUtil.serializeDouble(position.getY(), outputStream);
}
static Position deserialize(InputStream inputStream) {
double x = InputStreamUtil.deserializeDouble(inputStream);
double y = InputStreamUtil.deserializeDouble(inputStream);
Position positionObject = new Position();
positionObject.setX(x);
positionObject.setY(y);
return positionObject;
}
}
最后写了一个单元测试如下
public class PositionSerializerTest {
private InputStream iStream;
private ByteArrayOutputStream oStream;
@Before
public void init() {
oStream = new ByteArrayOutputStream();
}
Position serialzeAndDeserializeObject(Position positionObject) {
PositionSerializer.serialize(positionObject, oStream);
iStream = new ByteArrayInputStream(oStream.toByteArray());
return PositionSerializer.deserialize(iStream);
}
@Test
public void equals_equal() {
Position positionObject = new Position(5.5, 10.5);
Position deserializedPosition = serialzeAndDeserializeObject(positionObject);
assertThat(deserializedPosition).isEqualTo(positionObject);
}
}
怎么了?以及如何解决?
没有问题,但是你在反序列化方法中创建了一个新实例:
Position positionObject = new Position();
这将始终调用位置对象的新实例,因此您无法使用 == 运算符对其进行比较
您应该重写 equals 方法,如下所示:
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof Position)) {
return false;
}
Position otherObject = (Position)o;
if(this.x == otherObject.x && this.y == otherObject.y)
return true;
else return false;
}
然后调用:
assertThat(deserializedPosition).isEqualTo(positionObject);
您正在检查不相等的引用相等性,因为您的反序列化方法 returns 每次调用都会有新实例,请使用下面的值进行比较:
assertThat(deserializedPosition.getX()).isEqualTo(positionObject.getX())
assertThat(deserializedPosition.getY()).isEqualTo(positionObject.getY())
您的测试似乎是在比较对象引用而不是对象值。覆盖 equals 函数或分别比较位置对象中的每个值。