JUnit에서 객체가 클래스의 인스턴스라고 주장 할 수 있습니까? 여러 가지 이유로 테스트에서 유형을 확인하려는 객체가 있습니다. Object1의 유형입니까 아니면 Object2의 유형입니까?
현재 나는 :
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
이것은 작동하지만 더 표현하는 방법이 있는지 궁금합니다.
예를 들면 다음과 같습니다.
assertObjectIsClass(myObject, Object1);
나는 이것을 할 수있다 :
assertEquals(myObject.class, Object1.getClass());
좀 더 우아하고 유동적 인 방식으로 객체 유형을 테스트 할 수있는 특정 어설 션 방법이 있습니까?
답변
assertThat
JUnit과 함께 제공 되는 메소드 및 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)
}
}