Est-il possible dans JUnit d'affirmer qu'un objet est une instance d'une classe? Pour diverses raisons, j'ai un objet dans mon test dont je souhaite vérifier le type. S'agit-il d'un type d'Object1 ou d'un type d'Object2?
Actuellement j'ai:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
Cela fonctionne mais je me demandais s'il existe une manière plus expressive de le faire.
Par exemple quelque chose comme:
assertObjectIsClass(myObject, Object1);
Je pourrais faire ceci:
assertEquals(myObject.class, Object1.getClass());
Existe-t-il une méthode d'assert spécifique qui me permet de tester un type d'objet de manière plus élégante et fluide?
assertTrue(myObject instanceof Object1);
etassertEquals(myObject.class, Object1.getClass());
sont en fait des tests différents? Le premier accepte que myObject soit une instance d'une sous-classe deObject1
, le second ne le fait pas.assertTrue
.assertTrue
dirait juste, diraitexpected true got false
Hamcrestexpected instanced of XYZ, got instance of ABC
Réponses:
Vous pouvez utiliser la
assertThat
méthode et les Matchers fournis avec JUnit.Jetez un œil à ce lien qui décrit un peu plus les JUnit Matchers.
Exemple:
Tester:
la source
instanceof
:BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));
, mais il ne compile pas parce queSubClass
n'est pas? super BaseClass
.instanceOf(BaseClass.class)
eninstanceOf(String.class)
et vous verrez qu'il compile très bien mais il y aura une AssertionError lancée.Class<T>
place deClass<?>
(ce que fait instanceOf). Puisqu'il capture la classe, ce serait une erreur de compilation de faire isA avec une classe incompatible avec l'instance. github.com/hamcrest/JavaHamcrest/issues/39Depuis
assertThat
quelle était l'ancienne réponse est maintenant obsolète, je publie la bonne solution:assertTrue(objectUnderTest instanceof TargetObject);
la source
true
droit? Et je pense que vous voulez tester le type réel.Solution pour JUnit 5
La documentation dit:
Exemple pour Hamcrest :
Exemple pour AssertJ :
Notez que cela suppose que vous souhaitiez tester des comportements similaires à
instanceof
(qui accepte les sous-classes). Si vous voulez un type égal exact, je ne vois pas de meilleur moyen que d'affirmer que les deux classes sont égales comme vous l'avez mentionné dans la question.la source
assertThat()
est reporté à Hamcrest, de sorte que JUnit fonctionne également avec des bibliothèques d'assertions tierces.instanceOf
commeinstanceof
(attention au cas).instanceOf
est une fonction tandis queinstanceof
est un mot-clé Java .Solution pour JUnit 5 pour Kotlin!
Exemple pour Hamcrest :
Exemple pour AssertJ :
la source