[英]JUnit testing public boolean equals(Object obj)
我正在JUnit测试我正在处理的项目,并且遇到了墙上测试以下方法的问题:
public boolean equals(Object obj) {
if (!(obj instanceof Vehicle)) {
return false;
}
else {
Vehicle other = (Vehicle) obj;
return (owner + yearMakeModel + value).
equals(other.owner + other.yearMakeModel
+ other.value);
我正在使用以下测试来测试instnaceof,但是,它似乎并未测试正确的代码。 提交后,代码的这一部分将突出显示,并且我看到一条消息,表明我的测试未执行此方法。
/**
* instanceof test false.
*/
@Test public void instanceOfFalseTest() {
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Object obj = new Object();
Assert.assertFalse(obj instanceof Vehicle);
}
/**
* instanceof test true.
*/
@Test public void instanceOfTrueTest() {
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Object obj = new Object();
Assert.assertTrue(car1 instanceof(Vehicle);
无需测试Java的instanceof
运算符,因为它是JVM的内置功能,不是您自己开发的。
您应该测试equals
方法。 例如这样:
@Test public void equalsFalseTest1() {
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Object obj = new Object();
Assert.assertNotEquals(car1, obj);
}
@Test public void equalsFalseTest2() {
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Car car2 = new Car("Doe, John", "2017 Honda Accord", 222000, true);
Assert.assertNotEquals(car1, car2);
}
@Test public void equalsTrueTest() {
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Car car2 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Assert.assertEquals(car1, car2);
}
然后实际上调用了equals
方法。
Nikolas的另一个答案很好地解释了为什么当前的测试毫无意义。 一个更合理的测试如下所示:
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Car car2 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Car car3 = new Car("Jones, Samual", "2017 Honda Accord", 222000, true);
assertThat(car1, is(car2));
assertThat(car1, not(car3));
is()
指向Java Hamcrest匹配器(它们允许您以非常优雅的方式写下测试用例)。
您想考虑所有可能的方式,如何使两个对象相等或不相等。 然后,您(至少)对于每个用例都需要一个测试用例。 理想情况下,它们各自进入单独的独立@Test方法。
Java的instanceof
是JVM指令集的一部分,它是一个特定的同名指令。 如果有兴趣,请阅读第6章。Java虚拟机指令集: 6.5。 说明 。
幸运的是,既没有方法来@Override
实现也不能改变行为-这意味着此功能不可测试,并且由于使用定义定义了extends
并implements
关键字,因此无需测试对象是否是另一个对象的实例。
注意,方法Object::equals
与该运算符/指令无关。
另一个答案:
@Test public void instanceOfFalseTest() {
Object obj = new Object();
assertThat(obj, instanceOf(Vehicle.class));
}
@Test public void instanceOfTrueTest() {
Car car1 = new Car("Jones, Sam", "2017 Honda Accord", 222000, true);
Object obj = new Object();
assertThat(car1, instanceOf(Vehicle.class));
}
,其中instanceOf()检查Object是否是给定类的实例。
单击参考hamcrest instanceOf()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.