JUnit在测试时不调用对象等于
JUnit not calling object equals when testing
JUnit 抛出此错误:
java.lang.AssertionError: expected:<com.mycompany.models.EntityStringProperty@1e81f4dc> but was:<com.mycompany.models.EntityStringProperty@4d591d15>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:144)
at com.mycompany.models.EntityPropertyTest.testStringEntity(EntityPropertyTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
对于此测试:
@Test
public void testStringEntity() {
EntityProperty stringProperty = new EntityStringProperty("hello world");
EntityProperty stringPropertyCompare = new EntityStringProperty("hello world");
assertEquals(stringProperty, stringPropertyCompare);
}
甚至 equals
也被覆盖了:
public class EntityStringProperty extends PrimitiveEntityProperty {
/* NOTE: PrimitiveEntityProperty implements EntityProperty */
public EntityStringProperty(String stringValue) {
super(stringValue, String.class);
}
@Override public boolean equals(Object obj) {
if (EntityStringProperty.class.isAssignableFrom(obj.getClass())) {
EntityStringProperty property = (EntityStringProperty) obj;
if (getStringValue().equals(property.getStringValue()) && getValueType().isAssignableFrom(
property.getClass())) {
return true;
}
}
return false;
}
}
这里可能有什么问题? 我怎样才能正确地测试两个对象的相等性?
解决此问题的方法如下,将 equals
的实现更改为:
@Override public boolean equals(Object obj) {
if (EntityStringProperty.class.isAssignableFrom(obj.getClass())) {
EntityStringProperty property = (EntityStringProperty) obj;
if (getStringValue().equals(property.getStringValue()) && getValueType().isAssignableFrom(
property.getValueType())) {
return true;
}
}
return false;
}
注意变化,
getValueType().isAssignableFrom(property.getValueType())
JUnit 抛出此错误:
java.lang.AssertionError: expected:<com.mycompany.models.EntityStringProperty@1e81f4dc> but was:<com.mycompany.models.EntityStringProperty@4d591d15>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:144)
at com.mycompany.models.EntityPropertyTest.testStringEntity(EntityPropertyTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
对于此测试:
@Test
public void testStringEntity() {
EntityProperty stringProperty = new EntityStringProperty("hello world");
EntityProperty stringPropertyCompare = new EntityStringProperty("hello world");
assertEquals(stringProperty, stringPropertyCompare);
}
甚至 equals
也被覆盖了:
public class EntityStringProperty extends PrimitiveEntityProperty {
/* NOTE: PrimitiveEntityProperty implements EntityProperty */
public EntityStringProperty(String stringValue) {
super(stringValue, String.class);
}
@Override public boolean equals(Object obj) {
if (EntityStringProperty.class.isAssignableFrom(obj.getClass())) {
EntityStringProperty property = (EntityStringProperty) obj;
if (getStringValue().equals(property.getStringValue()) && getValueType().isAssignableFrom(
property.getClass())) {
return true;
}
}
return false;
}
}
这里可能有什么问题? 我怎样才能正确地测试两个对象的相等性?
解决此问题的方法如下,将 equals
的实现更改为:
@Override public boolean equals(Object obj) {
if (EntityStringProperty.class.isAssignableFrom(obj.getClass())) {
EntityStringProperty property = (EntityStringProperty) obj;
if (getStringValue().equals(property.getStringValue()) && getValueType().isAssignableFrom(
property.getValueType())) {
return true;
}
}
return false;
}
注意变化,
getValueType().isAssignableFrom(property.getValueType())