Утверждение объекта является определенным типом

Возможно ли в 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 (которое принимает подклассы). Если вы хотите точно одинаковый тип, я не вижу лучшего способа, чем утверждать, что два класса равны, как вы упомянули в вопросе.