web-dev-qa-db-ja.com

オブジェクトが特定のタイプであるとアサートする

JUnitでオブジェクトがクラスのインスタンスであると断言することは可能ですか?さまざまな理由で、テストにタイプをチェックしたいオブジェクトがあります。 Object1のタイプですか、Object2のタイプですか?

現在私が持っているもの:

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

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

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

assertObjectIsClass(myObject, Object1);

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

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

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

159
RNJ

assertThatメソッドと、JUnitに付属のMatchersを使用できます。

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

古い答えだったassertThatは現在廃止されているため、正しい解決策を投稿しています。

assertTrue(objectUnderTest instanceof TargetObject);

27
Carmageddon

JUnit 5のソリューション

ドキュメントには次のように書かれています:

ただし、JUnit Jupiterの org.junit.jupiter.Assertions クラスは、JUnit 4の org.junit.Assert クラスにあるようなメソッド assertThat() を提供しません 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);
    }

}
8
Franklin Yu