JUnitでオブジェクトがクラスのインスタンスであると断言することは可能ですか?さまざまな理由で、テストにタイプをチェックしたいオブジェクトがあります。 Object1のタイプですか、Object2のタイプですか?
現在私が持っているもの:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
これは機能しますが、これをより表現力豊かな方法があるかどうか疑問に思いました。
たとえば、次のようなものです:
assertObjectIsClass(myObject, Object1);
私はこれを行うことができます:
assertEquals(myObject.class, Object1.getClass());
よりエレガントで流動的な方法でオブジェクトのタイプをテストできる特定のassertメソッドはありますか?
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));
}
}
古い答えだったassertThat
は現在廃止されているため、正しい解決策を投稿しています。
assertTrue(objectUnderTest instanceof TargetObject);
ドキュメントには次のように書かれています:
ただし、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);
}
}