Afirmar que un objeto es de un tipo específico

7 minutos de lectura

avatar de usuario
RNJ

¿Es posible en JUnit afirmar que un objeto es una instancia de una clase? Por varias razones, tengo un objeto en mi prueba del que quiero verificar el tipo. ¿Es un tipo de Object1 o un tipo de Object2?

Actualmente tengo:

assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);

Esto funciona, pero me preguntaba si hay una forma más expresiva de hacerlo.

Por ejemplo algo como:

assertObjectIsClass(myObject, Object1);

Yo podría hacer esto:

assertEquals(myObject.class, Object1.getClass());

¿Existe un método de afirmación específico que me permita probar un tipo de objeto de una manera más elegante y fluida?

  • ¿Eres consciente de que assertTrue(myObject instanceof Object1); y assertEquals(myObject.class, Object1.getClass()); ¿Son realmente pruebas diferentes? El primero acepta myObject como una instancia de una subclase de Object1el último no.

    –Erich Kitzmüller

    13 de septiembre de 2012 a las 10:59

  • @ammoQ Muy buen punto. No pensé en las subclases. gracias por la aclaración

    – RNJ

    13 de septiembre de 2012 a las 11:04

  • como señala maba, considere usar Hamcrest. Esto es más que solo para que tenga una mejor prueba de trabajo. Hamcrest también proporciona un registro mucho mejor de la falla que el estándar assertTrue. assertTrue solo diría expected true got falsediría Hamcrest expected instanced of XYZ, got instance of ABC

    – Juan B.

    13 de septiembre de 2012 a las 11:14

avatar de usuario
mamá

Puedes usar el assertThat método y los Matchers que vienen con JUnit.

Echa un vistazo a este enlace eso describe un poco sobre los JUnit Matchers.

Ejemplo:

public class BaseClass {
}

public class SubClass extends BaseClass {
}

Prueba:

import org.junit.Test;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;

/**
 * @author maba, 2012-09-13
 */
public class InstanceOfTest {

    @Test
    public void testInstanceOf() {
        SubClass subClass = new SubClass();
        assertThat(subClass, instanceOf(BaseClass.class));
    }
}

  • Aquí está el enlace al Matcher que se está utilizando: hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/…

    – Juan B.

    13 de septiembre de 2012 a las 11:12

  • FYI, MatcherAssert.assertThat se comporta mejor (proporciona un mejor registro en caso de errores) que Assert.assertThat. Recomiendo usarlo en su lugar. hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/…

    – Juan B.

    13 de septiembre de 2012 a las 11:15

  • ¡Esa es una afirmación trivial y sería un error de compilación si no fuera cierto en el ejemplo! Por lo general, desea descender en la jerarquía de clases con instanceof: BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));pero no compila porque SubClass no es ? super BaseClass.

    – TWiStErRob

    3 de septiembre de 2014 a las 10:01

  • @TWiStErRob No entiendo lo que estás tratando de decir aquí… Intenta cambiar el instanceOf(BaseClass.class) a instanceOf(String.class) y verá que se compila bien, pero se lanzará un AssertionError.

    – mamá

    3 de septiembre de 2014 a las 11:39

  • @maba, está hablando de isA por alguna razón, lo que captura la clase, acepta Class<T> en vez de Class<?> (que es lo que hace instanceOf). Dado que captura la clase, sería un error de tiempo de compilación hacer isA con una clase incompatible con la instancia. github.com/hamcrest/JavaHamcrest/issues/39

    – Vsévolod Golovanov

    28 de junio de 2017 a las 8:45

Ya que assertThat que era la respuesta anterior ahora está en desuso, estoy publicando la solución correcta:

assertTrue(objectUnderTest instanceof TargetObject);

  • si objectUnderTest es una subclase de TargetObject, esto aún resultará en true ¿Correcto? Y creo que quieres probar el tipo real.

    – EricG

    27 de noviembre de 2018 a las 10:33

  • Siento que esta NO es la respuesta correcta. La pregunta original pedía algo que verifique específicamente el tipo exacto del objeto. Esta solución no es eso (como se mencionó anteriormente en @EircG) e incluso ha sido proporcionada por el usuario que originalmente hizo la pregunta, por lo que definitivamente no es la respuesta “correcta” en mi opinión. Para obtener la respuesta correcta, consulte la respuesta de Franklin Yu.

    – kekko12

    8 sep 2019 a las 15:44


  • Bueno, tiene el inconveniente de que @EricG mencionó que sí, sobre la respuesta de Franklin: solo lo miré y no tenía sentido para mí, así que lo probé en mi proyecto con Junit5: ¡es incorrecto! ¡no existe tal sintaxis para instanceof, ni un método llamado InstanceOf! Está totalmente equivocado. Todavía mantengo mi respuesta, y como se evidencia, ¡fue útil para al menos 30 personas que votaron a favor! (Supongo que votaste negativo).

    – Carmagedón

    9 sep 2019 a las 19:01

  • @ kekko12 Mi respuesta tampoco verifica el tipo exacto; acepta una subclase similar a esta respuesta. He actualizado mi respuesta para abordarlo; Lo siento, no me di cuenta de esta parte en cuestión. Creo que la igualdad exacta no está incluida en la mayoría de las bibliotecas de aserciones porque no se usa con frecuencia.

    -Franklin Yu

    10 de septiembre de 2019 a las 1:22

  • @Carmageddon La respuesta de Franlin Yu funciona bien si utiliza la importación de aserciones de Hamcrest: “` import static org.hamcrest.CoreMatchers.instanceOf; “` ss por sus ejemplos de código. Lo admito, aunque pasé por alto la respuesta de Franklin y, de hecho, estas 2 respuestas son funcionalmente equivalentes, así que supongo que al final es solo una cuestión de preferencia.

    – kekko12

    13 de septiembre de 2019 a las 13:07

avatar de usuario
franklin yu

Solución para JUnit 5

La documentación dice:

Sin embargo, JUnit Júpiter org.junit.jupiter.Assertions la clase no proporciona una assertThat() método como el que se encuentra en JUnit 4’s org.junit.Assert clase que acepta un Hamcrest Matcher. En su lugar, se alienta a los desarrolladores a utilizar el soporte integrado para los comparadores proporcionado por bibliotecas de aserción de terceros.

Ejemplo para Hamcrest:

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.jupiter.api.Test;

class HamcrestAssertionDemo {

    @Test
    void assertWithHamcrestMatcher() {
        SubClass subClass = new SubClass();
        assertThat(subClass, instanceOf(BaseClass.class));
    }

}

Ejemplo para AfirmarJ:

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

class AssertJDemo {

    @Test
    void assertWithAssertJ() {
        SubClass subClass = new SubClass();
        assertThat(subClass).isInstanceOf(BaseClass.class);
    }

}

Tenga en cuenta que esto supone que desea probar comportamientos similares a instanceof (que acepta subclases). Si desea un tipo exactamente igual, no veo una mejor manera que afirmar que las dos clases son iguales como mencionó en la pregunta.

  • En cierto sentido, el original assertThat() se difiere a Hamcrest, por lo que JUnit también funciona con bibliotecas de aserción de terceros.

    -Franklin Yu

    10 de enero de 2018 a las 16:21


  • Acabo de probar esta respuesta, NO es correcta y conduce a múltiples errores de compilación: inicio de expresión ilegal, inicio de tipo ilegal, ‘;’ esperado… En otras palabras, su segundo parámetro para el comparador de afirmación, ¡NO PUEDE ser “instancia de (BaseClass.class)”! De hecho, ni siquiera lo escribiste correctamente, la sintaxis que usaste es ligeramente diferente: “InstanceOf(” – ¡como una llamada de función! En realidad, no existe tal función… ¿alguien la probó? Parece que se hizo manualmente mecanografiado sin ninguna prueba

    – Carmagedón

    9 sep 2019 a las 19:00

  • @Carmageddon Proporcioné dos respuestas, una para Hamcrest y la otra para AssertJ. De cual estas hablando?

    -Franklin Yu

    10 de septiembre de 2019 a las 1:03

  • @Carmageddon Sospecho que estás hablando del ejemplo de Hamcrest y te equivocaste al escribir instanceOf como instanceof (cuidado con el caso). instanceOf es Una función tiempo instanceof es una palabra clave de Java.

    -Franklin Yu

    10 de septiembre de 2019 a las 1:14

  • Me referí a Hamcrest, por supuesto, y probé tanto la palabra clave AND como una función después de notar que así es como lo escribiste: no existe tal función …

    – Carmagedón

    11 de septiembre de 2019 a las 2:57

¡Solución para JUnit 5 para Kotlin!

Ejemplo para Hamcrest:

import org.hamcrest.CoreMatchers
import org.hamcrest.MatcherAssert
import org.junit.jupiter.api.Test

class HamcrestAssertionDemo {

    @Test
    fun assertWithHamcrestMatcher() {
        val subClass = SubClass()
        MatcherAssert.assertThat(subClass, CoreMatchers.instanceOf<Any>(BaseClass::class.java))
    }

}

Ejemplo para AfirmarJ:

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class AssertJDemo {

    @Test
    fun assertWithAssertJ() {
        val subClass = SubClass()
        assertThat(subClass).isInstanceOf(BaseClass::class.java)
    }

}

Solución para JUnit para Kotlin

Lo que funcionó para mí:

assert(obj is ClassName)

por ejemplo

assert(obj is User)

NOTA: afirmar proviene de AssertionsJVM.kt expediente

avatar de usuario
gla3dr

Solución Experimental para JUnit 5.8

En Junit 5.8, el experimental assertInstanceOf() Se agregó el método, por lo que ya no necesita Hamcrest o AssertJ. La solución ahora es tan simple como:

import static org.junit.jupiter.api.Assertions.assertInstanceOf;

import org.junit.Test;

public class InstanceOfTest {

    @Test
    public void testInstanceOf() {
        SubClass subClass = new SubClass();
        assertInstanceOf(BaseClass.class, subClass);
    }
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad