断言对象是特定类型

RNJ*_*RNJ 176 java junit unit-testing

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

目前我有:

assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
Run Code Online (Sandbox Code Playgroud)

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

例如:

assertObjectIsClass(myObject, Object1);
Run Code Online (Sandbox Code Playgroud)

我能做到这一点:

assertEquals(myObject.class, Object1.getClass());
Run Code Online (Sandbox Code Playgroud)

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

mab*_*aba 228

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

看一下这个描述JUnit Matchers的链接.

例:

public class BaseClass {
}

public class SubClass extends BaseClass {
}
Run Code Online (Sandbox Code Playgroud)

测试:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个微不足道的断言,如果在示例中不正确则会出现编译错误!通常你想用`instanceof`下去类层次结构:`BaseClass subClass = new SubClass(); assertThat(subClass,isA(SubClass.class));`,但它不能编译因为`SubClass`不是`?超级BaseClass`. (12认同)
  • 以下是使用Matcher的链接:http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/CoreMatchers.html#instanceOf(java.lang.Class) (4认同)
  • FYI,MatcherAssert.assert比Assert.assertThat表现更好(在错误的情况下提供更好的日志记录).我推荐使用它.http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/MatcherAssert.html (3认同)
  • @TWiStErRob我不明白你在这里想说的是什么...尝试将`instanceOf(BaseClass.class)`更改为`instanceOf(String.class)`你会看到它编译得很好但是那里将抛出AssertionError. (3认同)

Car*_*don 32

既然assertThat旧答案现已弃用,我发布了正确的解决方案:

assertTrue(objectUnderTest instanceof TargetObject);

  • 如果 objectUnderTest 是 TargetObject 的子类,这仍然会导致“true”,对吗?而且我认为您想测试实际类型。 (2认同)

Fra*_* Yu 18

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));
    }

}
Run Code Online (Sandbox Code Playgroud)

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);
    }

}
Run Code Online (Sandbox Code Playgroud)


gla*_*3dr 10

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);
    }
}

Run Code Online (Sandbox Code Playgroud)


Mah*_*rok 7

适用于 Kotlin 的 JUnit 解决方案

对我有用的:

assert(obj is ClassName)
Run Code Online (Sandbox Code Playgroud)

例如

assert(obj is User)
Run Code Online (Sandbox Code Playgroud)

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


Nar*_*pai 5

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))
    }

}
Run Code Online (Sandbox Code Playgroud)

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)
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 使用 `assertThat(actualException, not(instanceOf(BaseClass.class))); ` 为阴性测试。 (2认同)