Можно ли в JUnit утверждать, что объект является экземпляром класса? По разным причинам в моем тесте есть объект, который я хочу проверить тип. Это тип Object1 или тип Object2?
В настоящее время у меня есть:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
Это работает, но мне было интересно, есть ли более выразительный способ сделать это.
Например что-то вроде:
assertObjectIsClass(myObject, Object1);
Я мог бы сделать это:
assertEquals(myObject.class, Object1.getClass());
Есть ли конкретный метод подтверждения, который позволяет мне проверять тип объекта более элегантным и гибким способом?
assertTrue(myObject instanceof Object1);
иassertEquals(myObject.class, Object1.getClass());
на самом деле это разные тесты? Первая принимает myObject как экземпляр подклассаObject1
, а вторая - нет.assertTrue
.assertTrue
сказал быexpected true got false
, Хамкрест сказал быexpected instanced of XYZ, got instance of ABC
Ответы:
Вы можете использовать
assertThat
метод и Matchers, которые идут с JUnit.Взгляните на эту ссылку, которая описывает немного о JUnit Matchers.
Пример:
Тест:
источник
instanceof
:,BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));
но она не компилируется, потому чтоSubClass
это не так? super BaseClass
.instanceOf(BaseClass.class)
чтобыinstanceOf(String.class)
и вы увидите , что это компиляция просто отлично , но там будет AssertionError выброшен.Class<T>
вместо негоClass<?>
(что делает instanceOf). Поскольку он захватывает класс, было бы ошибкой времени компиляции делать isA с классом, несовместимым с экземпляром. github.com/hamcrest/JavaHamcrest/issues/39Поскольку
assertThat
прежний ответ устарел, я выкладываю правильное решение:assertTrue(objectUnderTest instanceof TargetObject);
источник
true
правильному? И я думаю, что вы хотите проверить фактический тип.Решение для JUnit 5
Документация гласит:
Пример для Hamcrest :
Пример для AssertJ :
Обратите внимание, что это предполагает, что вы хотите протестировать поведение, аналогичное
instanceof
(которое принимает подклассы). Если вы хотите точно одинаковый тип, я не вижу лучшего способа, чем утверждать, что два класса равны, как вы упомянули в вопросе.источник
assertThat()
отложен до Hamcrest, так что JUnit также работает со сторонними библиотеками утверждений.instanceOf
какinstanceof
( обратите внимание на случай).instanceOf
является функцией , аinstanceof
это ключевое слово Java .Решение для JUnit 5 для Kotlin!
Пример для Hamcrest :
Пример для AssertJ :
источник