断言对象是特定类型

问题

是否有可能在JUnit中断言一个对象是一个类的实例?由于各种原因,我在测试中有一个对象,我想检查其类型。它是Object1的类型还是Object2的类型?

目前我有:

assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);

这有效,但我想知道是否有更具表现力的方式来做到这一点。

例如:

assertObjectIsClass(myObject, Object1);

我能做到这一点:

assertEquals(myObject.class, Object1.getClass());

是否有一个特定的断言方法允许我以更优雅,流畅的方式测试对象的类型?


#1 热门回答(188 赞)

你可以使用11868616方法和JUnit附带的Matchers。

看看this link,它描述了一些关于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 热门回答(12 赞)

自从assertThat这个旧答案现已弃用,我发布了正确的解决方案:
assertTrue(objectUnderTest instanceof TargetObject);


#3 热门回答(3 赞)

JUnit 5的解决方案

文件说:

但是,JUnit Jupiter的org.junit.jupiter.Assertions类不提供类似于JUnit 4的org.junit.Assert类中的assertThat()方法,该类接受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);
    }

}