在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));
}
}
JUnit 5的解决方案
文件说:
然而,JUnit Jupiter的org.junit.jupiter.Assertions类没有提供一个assertThat()方法,就像JUnit 4的org. junter . 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(接受子类)的行为。如果你想要确切的相等类型,我认为没有比断言两个类相等更好的方法了,就像你在问题中提到的那样。