Czy w JUnit można stwierdzić, że obiekt jest instancją klasy? Z różnych powodów w teście mam obiekt, który chcę sprawdzić typ. Czy jest to typ Object1 czy typ Object2?
Obecnie mam:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
To działa, ale zastanawiałem się, czy istnieje bardziej ekspresyjny sposób na zrobienie tego.
Na przykład coś takiego:
assertObjectIsClass(myObject, Object1);
Mógłbym to zrobić:
assertEquals(myObject.class, Object1.getClass());
Czy istnieje konkretna metoda asercji, która pozwala mi testować typ obiektu w bardziej elegancki, płynny sposób?
java
unit-testing
junit
RNJ
źródło
źródło
assertTrue(myObject instanceof Object1);
iassertEquals(myObject.class, Object1.getClass());
czy faktycznie są to różne testy? Pierwszy akceptuje myObject jako instancję podklasyObject1
, później nie.assertTrue
.assertTrue
powiedziałby po prostuexpected true got false
, Hamcrest powiedziałbyexpected instanced of XYZ, got instance of ABC
Odpowiedzi:
Możesz użyć
assertThat
metody i dopasowań dostarczonych z JUnit.Spójrz na ten link, który opisuje trochę o JUnit Matchers.
Przykład:
Test:
źródło
instanceof
:BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));
, ale nie skompilować, ponieważSubClass
nie jest? super BaseClass
.instanceOf(BaseClass.class)
sięinstanceOf(String.class)
, a zobaczysz, że to w porządku, ale po prostu skompilować nie będzie AssertionError rzucony.Class<T>
zamiast niejClass<?>
(co robi instancjaOf). Ponieważ przechwytuje klasę, błędem czasu kompilacji byłoby isA z klasą niezgodną z instancją. github.com/hamcrest/JavaHamcrest/issues/39Ponieważ
assertThat
poprzednia odpowiedź jest obecnie nieaktualna, zamieszczam prawidłowe rozwiązanie:assertTrue(objectUnderTest instanceof TargetObject);
źródło
true
tak? I myślę, że chcesz przetestować rzeczywisty typ.Rozwiązanie dla JUnit 5
Dokumentacja mówi:
Przykład dla Hamcrest :
Przykład dla AssertJ :
Zauważ, że zakłada to, że chcesz przetestować zachowania podobne do
instanceof
(które akceptują podklasy). Jeśli chcesz dokładnie równego typu, nie widzę lepszego sposobu niż twierdzenie, że dwie klasy są równe, jak wspomniano w pytaniu.źródło
assertThat()
jest odroczony do Hamcrest, więc JUnit działa również z bibliotekami asercji innych firm.instanceOf
jakoinstanceof
(przeszkadza sprawę).instanceOf
jest funkcją, podczas gdyinstanceof
jest słowem kluczowym Java .Rozwiązanie dla JUnit 5 dla Kotlin!
Przykład dla Hamcrest :
Przykład dla AssertJ :
źródło