IT

개체가 특정 유형임을 주장합니다.

itgroup 2022. 11. 7. 21:27
반응형

개체가 특정 유형임을 주장합니다.

JUnit에서 객체가 클래스의 인스턴스라고 단정할 수 있습니까?여러 가지 이유로 테스트에서 종류를 확인하고 싶은 대상이 있습니다.Object1의 유형입니까, Object2의 유형입니까?

현재 가지고 있는 것은 다음과 같습니다.

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

이것은 효과가 있지만 나는 이것을 좀 더 표현하기 위한 방법이 없을까 하고 생각했다.

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

assertObjectIsClass(myObject, Object1);

난 할 수 있어:

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

좀 더 우아하고 유동적인 방법으로 물체의 종류를 테스트할 수 있는 특별한 아사트 방법이 있나요?

를 사용할 수 있습니다.assertThatJUnit과 함께 제공되는 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 5용 솔루션

문서에는 다음과 같이 기재되어 있습니다.

하지만, JUnit Jupiter의 클래스는 JUnit 4의 클래스에서 볼 수 있는 햄크레스트를 받아들이는 것과 같은 방법을 제공하지 않습니다.대신, 개발자들은 서드파티 어설션 라이브러리에서 제공하는 내장 지원 기능을 사용할 것을 권장합니다.

햄크레스트의 예:

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(서브클래스를 받아들입니다).만약 당신이 정확히 같은 유형을 원한다면, 나는 당신이 질문에서 말한 것처럼 두 계급이 동등하다고 주장하는 것보다 더 좋은 방법이 없다고 생각합니다.

JUnit 5 for Kotlin 솔루션!

햄크레스트의 예:

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

}

Kotlin용 JUnit 솔루션

나에게 효과가 있었던 것:

assert(obj is ClassName)

예시로

assert(obj is User)

메모: Assert는 다음에서 가져옵니다.AssertionsJVM.kt파일

JUnit 5.8용 실험 솔루션

Junit 5.8에서는 실험 방법이 추가되었기 때문에 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);
    }
}

언급URL : https://stackoverflow.com/questions/12404650/assert-an-object-is-a-specific-type

반응형