簡體   English   中英

JUnit測試公共布爾等於(對象obj)

[英]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實現也不能改變行為-這意味着此功能不可測試,並且由於使用定義定義了extendsimplements關鍵字,因此無需測試對象是否是另一個對象的實例。

注意,方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM