Утверждение объекта является определенным типом
Возможно ли в JUnit утверждать, что объект является экземпляром класса? По разным причинам у меня есть объект в моем тесте, который я хочу проверить. Является ли это объектом Object1 или типом Object2?
В настоящее время у меня есть:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
Это работает, но мне было интересно, есть ли более выразительный способ сделать это.
Например, что-то вроде:
assertObjectIsClass(myObject, Object1);
Я мог бы сделать это:
assertEquals(myObject.class, Object1.getClass());
Существует ли конкретный метод assert, который позволяет мне тестировать тип объекта более элегантным, жидким способом?
Ответы
Ответ 1
Вы можете использовать метод assertThat
и совпадения, которые поставляются с JUnit.
Посмотрите эту ссылку, которая немного описывает JUnit Matchers.
Пример:
public class BaseClass {
}
public class SubClass extends BaseClass {
}
Тест:
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));
}
}
Ответ 2
Поскольку assertThat
, который был старым ответом, теперь устарел, я публикую правильное решение:
assertTrue(objectUnderTest instanceof TargetObject);
Ответ 3
Решение для JUnit 5
В документации сказано:
Однако класс JUnit Jupiters org.junit.jupiter.Assertions
не предоставляет метод assertThat()
, подобный методу, найденному в классе JUnit 4s org.junit.Assert
, который принимает Hamcrest Matcher
. Вместо этого разработчикам рекомендуется использовать встроенную поддержку сопоставлений, предоставляемую сторонними библиотеками утверждений.
Пример для 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));
}
}
Пример для AssertJ:
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);
}
}
Обратите внимание, что это предполагает, что вы хотите протестировать поведение, подобное instanceof
(которое принимает подклассы). Если вы хотите точно одинаковый тип, я не вижу лучшего способа, чем утверждать, что два класса равны, как вы упомянули в вопросе.