[英]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.