226

JUnitでオブジェクトがクラスのインスタンスであると主張することは可能ですか? さまざまな理由から、タイプを確認したいオブジェクトがテストに含まれています。Object1 のタイプですか、それとも Object2 のタイプですか?

現在私は持っています:

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

これは機能しますが、これを行うより表現力豊かな方法があるかどうか疑問に思っていました。

たとえば、次のようなものです。

assertObjectIsClass(myObject, Object1);

私はこれを行うことができます:

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

オブジェクトのタイプをよりエレガントで滑らかな方法でテストできる特定の assert メソッドはありますか?

4

6 に答える 6

284

assertThatJUnitに付属しているメソッドとマッチャーを使用できます。

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 に答える
6

JUnit 5 for Kotlin のソリューション!

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 に答える