Estoy trabajando en JUnit probando un proyecto en el que estoy trabajando, y me encontré con un muro probando el siguiente método:

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

Estoy usando las siguientes pruebas para probar el instinto, sin embargo, no parece estar probando el código correcto. Después de enviar, esta sección de mi código se resalta y veo un mensaje de que este método no se ejecuta en mis pruebas.

/** 
 * 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);
1
MichaelL 13 sep. 2018 a las 20:53

4 respuestas

La mejor respuesta

La otra respuesta de Nikolas explica muy bien por qué sus pruebas actuales no tienen sentido. Una prueba más razonable podría verse así:

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

Donde is() se refiere a un Java Hamcrest (le permiten anotar sus casos de prueba en formas muy elegantes).

Desea pensar en todas las formas posibles en que dos objetos podrían ser iguales, ni no iguales. Y luego, usted (al menos) un caso de prueba para cada uno de esos casos. Idealmente, cada uno de ellos utiliza un método de prueba independiente e independiente.

2
GhostCat 13 sep. 2018 a las 18:49

La otra respuesta:

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

, donde instanceOf () verifica si un Object es una instancia de una clase dada.

Haga clic en hamcrest de referencia instanceOf ()

0
eamazaj 13 sep. 2018 a las 19:12

No es necesario probar el operador instanceof de Java, porque es una funcionalidad integrada de la JVM, no desarrollada por usted.

Deberías probar tu método equals. Por ejemplo así:

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

Entonces su método equals se llama realmente.

2
Thomas Fritsch 13 sep. 2018 a las 18:35

El instanceof de Java es parte del conjunto de instrucciones JVM, es una instrucción específica con el mismo nombre. Si está interesado, lea el Capítulo 6. El conjunto de instrucciones de la máquina virtual Java: 6.5. Instrucciones.

Afortunadamente, no hay una manera de @Override la implementación ni cambiar el comportamiento; esto implica que esta característica no es verificable y no hay necesidad de probar si un objeto es una instancia de otro desde la definición que usa extends y implements palabras clave.

Tenga en cuenta que el método Object::equals es irrelevante hacer con este operador / instrucción.

1
Nikolas 13 sep. 2018 a las 18:09