226

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

目前我有:

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

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

例如:

assertObjectIsClass(myObject, Object1);

我可以这样做:

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

是否有特定的断言方法可以让我以更优雅、更流畅的方式测试对象的类型?

4

6 回答 6

284

您可以使用assertThatJUnit 附带的方法和 Matchers。

看看这个链接,它描述了一点关于 JUnit 匹配器的信息。

例子:

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));
    }
}
于 2012-09-13T11:03:47.137 回答
69

由于assertThat现在已弃用旧答案,因此我发布了正确的解决方案:

assertTrue(objectUnderTest instanceof TargetObject);

于 2017-12-19T15:46:36.120 回答
31

JUnit 5 的解决方案

文档说:

但是,JUnit Jupiter 的org.junit.jupiter.Assertions类没有提供assertThat()像 JUnit 4 的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(接受子类)的行为。如果您想要完全相等的类型,我认为没有比像您在问题中提到的那样断言两个类相等更好的方法了。

于 2018-01-10T16:11:34.197 回答
6

Kotlin 的 JUnit 5 解决方案!

Hamcrest示例:

import org.hamcrest.CoreMatchers
import org.hamcrest.MatcherAssert
import org.junit.jupiter.api.Test

class HamcrestAssertionDemo {

    @Test
    fun assertWithHamcrestMatcher() {
        val subClass = SubClass()
        MatcherAssert.assertThat(subClass, CoreMatchers.instanceOf<Any>(BaseClass::class.java))
    }

}

AssertJ的示例:

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class AssertJDemo {

    @Test
    fun assertWithAssertJ() {
        val subClass = SubClass()
        assertThat(subClass).isInstanceOf(BaseClass::class.java)
    }

}
于 2020-03-27T13:47:51.727 回答
3

Kotlin 的 JUnit 解决方案

什么对我有用:

assert(obj is ClassName)

例如

assert(obj is User)

注意:断言来自AssertionsJVM.kt文件

于 2021-09-12T15:50:01.863 回答
2

JUnit 5.8 的实验解决方案

在 Junit 5.8 中,添加了实验 assertInstanceOf()方法,因此您不再需要 Hamcrest 或 AssertJ。解决方案现在很简单:

import static org.junit.jupiter.api.Assertions.assertInstanceOf;

import org.junit.Test;

public class InstanceOfTest {

    @Test
    public void testInstanceOf() {
        SubClass subClass = new SubClass();
        assertInstanceOf(BaseClass.class, subClass);
    }
}

于 2022-01-21T23:53:26.390 回答