개체가 특정 유형이라고 가정 인스턴스라고 주장 할 수 있습니까? 여러 가지

JUnit에서 객체가 클래스의 인스턴스라고 주장 할 수 있습니까? 여러 가지 이유로 테스트에서 유형을 확인하려는 객체가 있습니다. Object1의 유형입니까 아니면 Object2의 유형입니까?

현재 나는 :

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

이것은 작동하지만 더 표현하는 방법이 있는지 궁금합니다.

예를 들면 다음과 같습니다.

assertObjectIsClass(myObject, Object1);

나는 이것을 할 수있다 :

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

좀 더 우아하고 유동적 인 방식으로 객체 유형을 테스트 할 수있는 특정 어설 션 방법이 있습니까?



답변

assertThatJUnit과 함께 제공 되는 메소드 및 Matcher를 사용할 수 있습니다 .

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 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이는 하위 클래스를 허용하는 것과 유사한 동작을 테스트한다고 가정합니다 . 정확히 같은 유형을 원한다면 질문에서 언급 한 것처럼 두 클래스를 동일하게 주장하는 것보다 더 좋은 방법은 없습니다.


답변

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

}


답변