Java JUnit测试公共布尔等于(对象obj)

Java JUnit测试公共布尔等于(对象obj),java,junit,Java,Junit,我正在进行JUnit测试我正在进行的一个项目,并遇到了一个测试以下方法的墙: public boolean equals(Object obj) { if (!(obj instanceof Vehicle)) { return false; } else { Vehicle other = (Vehicle) obj; return (owner + yearMakeModel + value). equals(other.owner

我正在进行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);
我使用以下测试来测试instanceof,但是,它似乎没有测试正确的代码。提交后,我的代码的这一部分会突出显示,我看到一条消息,说明我的测试中没有执行此方法

/** 
 * 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指令集的一部分,它是一个特定的同名指令。如果感兴趣,请阅读第6章。Java虚拟机指令集:

幸运的是,既没有办法@Override实现,也没有办法改变行为——这意味着这个特性是不稳定的,并且没有必要测试一个对象是否是另一个对象的实例,因为定义使用了extends和implements关键字

请注意,该方法与此运算符/指令无关。

Java的instanceof是JVM指令集的一部分,它是一个特定的同名指令。如果感兴趣,请阅读第6章。Java虚拟机指令集:

幸运的是,既没有办法@Override实现,也没有办法改变行为——这意味着这个特性是不稳定的,并且没有必要测试一个对象是否是另一个对象的实例,因为定义使用了extends和implements关键字


请注意,该方法与此运算符/指令无关。

无需测试Java的instanceof运算符, 因为它是JVM的内置功能,不是由您开发的

你应该测试一下你的方法。 例如:

@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);
}
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));

然后实际调用equals方法。

无需测试Java的instanceof运算符, 因为它是JVM的内置功能,不是由您开发的

你应该测试一下你的方法。 例如:

@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);
}
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));

然后实际上调用了equals方法。

Nikolas的另一个答案很好地解释了为什么当前的测试毫无意义。更合理的测试可以如下所示:

@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);
}
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));
where is指的是一个匹配器,它允许您以非常优雅的方式写下您的测试用例


你要想出所有可能的方法,让两个物体可以相等,也可以不相等。然后,为每个案例至少创建一个测试用例。理想情况下,它们各自进入一个独立的@Test方法。

尼古拉斯的另一个答案很好地解释了为什么当前的测试毫无意义。更合理的测试可以如下所示:

@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);
}
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));
where is指的是一个匹配器,它允许您以非常优雅的方式写下您的测试用例

你要想出所有可能的方法,让两个物体可以相等,也可以不相等。然后,为每个案例至少创建一个测试用例。理想情况下,它们各自进入一个独立的@测试方法。

另一个答案:

 @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检查对象是否为给定类的实例

单击“参考”按钮,查看其他答案:

 @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检查对象是否为给定类的实例


单击reference hamcrest

这有什么问题?你的意思是没有调用equals方法吗?在JUnit中,不应该测试java库或外部库,应该测试他的代码。你应该测试equals函数,而不是instanceof关键字这有什么不对?你的意思是没有调用equals方法吗?在JUnit中,不应该测试java库或外部库,应该测试他的代码。你应该测试equals函数,而不是关键字的实例你在我离线写答案的时候写了答案,但是我们的答案有点不同,所以我想我也会保留我的答案-@幽灵猫的答案相似,但不相等-你写了你的答案,而我写我的离线,但好吧,我们的答案有点不同,所以我想我也会保持我的-@幽灵猫的答案相似,但不相等-我喜欢你在这里的链接,我喜欢你为其他答案留下一些空间-我喜欢你在这里的链接,我喜欢你为其他答案留下一些空间-