Junit тестирует публичное логическое равенство (объект 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);

что с этим не так? вы имеете в виду, что ваш метод equals() не вызывается?

Deadpool 13.09.2018 20:04

В JUnit не следует тестировать java-библиотеки или внешние библиотеки, нужно тестировать его код. Вы должны тестировать функцию равенства, а не ключевое слово instanceof

Rishabh Agarwal 13.09.2018 20:16
1
2
2 164
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

instanceof Java является частью набора инструкций JVM, это конкретная инструкция с таким же названием. Если интересно, прочтите главу 6. Набор инструкций виртуальной машины Java: 6.5. инструкции.

К счастью, нет ни способа реализовать @Override, ни изменить поведение - это означает, что эта функция не поддается тестированию, и нет необходимости проверять, является ли объект экземпляром другого объекта, поскольку определение использует ключевые слова extends и implements.

Обратите внимание, что метод Object::equals не имеет отношения к этому оператору / инструкции.

Мне нравятся ваши ссылки здесь, и мне нравится, что вы оставили немного места для других ответов ;-)

GhostCat 13.09.2018 20:45

Нет необходимости тестировать оператор 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.

Вы написали свой ответ, пока я писал свой в автономном режиме, но что ж, наши ответы немного отличаются, так что я думаю, что я тоже оставлю свой ;-)

GhostCat 13.09.2018 20:44

@GhostCat похожие ответы, но не равные ;-)

Thomas Fritsch 13.09.2018 20:55
Ответ принят как подходящий

Другой ответ Николаса прекрасно объясняет, почему ваши текущие тесты бессмысленны. Более разумный тест мог бы выглядеть так:

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() относится к сопоставителю Ява Хамкрест (они позволяют очень элегантно записывать свои тестовые примеры).

Вы хотите придумать все возможные способы, при которых два объекта могут быть равны, а нет равны. И затем вы (по крайней мере) один тестовый пример для каждого из этих случаев. В идеале каждый из них следует использовать в отдельном независимом методе @Test.

Другой ответ:

 @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 () проверяет, является ли объект экземпляром данного класса.

Нажмите ссылку hamcrest экземпляр()

Другие вопросы по теме