Java 断言对象是特定类型
在JUnit中是否可以断言对象是类的实例?出于各种原因,我在测试中有一个对象,我想检查对象的类型。它是Object1类型还是Object2类型 目前我有:Java 断言对象是特定类型,java,unit-testing,junit,Java,Unit Testing,Junit,在JUnit中是否可以断言对象是类的实例?出于各种原因,我在测试中有一个对象,我想检查对象的类型。它是Object1类型还是Object2类型 目前我有: assertTrue(myObject instanceof Object1); assertTrue(myObject instanceof Object2); 这是可行的,但我想知道是否有一种更具表现力的方式来做到这一点 例如: assertObjectIsClass(myObject, Object1); 我可以这样做: asser
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
这是可行的,但我想知道是否有一种更具表现力的方式来做到这一点
例如:
assertObjectIsClass(myObject, Object1);
我可以这样做:
assertEquals(myObject.class, Object1.getClass());
是否有一种特定的assert方法允许我以更优雅、更流畅的方式测试对象类型?您可以使用
assertThat
方法和JUnit附带的匹配器
看一看,它描述了一点关于JUnit Matchers的内容
例如:
public class BaseClass {
}
public class SubClass extends BaseClass {
}
测试:
由于
assertThat
原来的答案现在已被弃用,我将发布正确的解决方案:
assertTrue(TargetObject的测试实例下的object)代码>JUnit 5的解决方案
文件说:
然而,JUnitJupiter的类并没有提供一个类似于JUnit4的类中的方法,该类接受Hamcrest。相反,鼓励开发人员使用第三方断言库提供的对匹配器的内置支持
例如:
例如:
注意,这假设您想要测试类似于instanceof
(接受子类)的行为。如果您想要完全相等的类型,我认为没有比像您在问题中提到的那样断言两个类相等更好的方法了。JUnit 5 for Kotlin的解决方案!
例如:
您是否知道assertTrue(Object1的myObject实例)代码>和assertEquals(myObject.class,Object1.getClass())代码>实际上是不同的测试吗?第一个接受myObject是Object1
的子类的一个实例,第二个不接受。我没有想到子类。感谢clarifactionas maba指出,考虑使用HAMCSTREST。这不仅仅是为了让你有一个更好的工作测试。Hamcrest还提供了比标准assertTrue
更好的故障记录assertTrue
只会说expected true get false
,Hamcrest会说XYZ的expected instance,ABC的got instance
这里是指向所使用匹配器的链接:仅供参考,matcherasert.assertit比Assert.Assert性能更好(在出现错误时提供更好的日志记录)。我建议改用它。这是一个微不足道的断言,如果在示例中不是真的,那将是一个编译错误!通常,您希望使用instanceof
:基类子类=新子类();资产(子类,isA(子类,类))代码>,但它不会编译,因为子类
不是?超级基类
@TWiStErRob我不明白你想说什么。。。尝试将instanceOf(BaseClass.class)
更改为instanceOf(String.class)
,您会看到它编译得很好,但会抛出一个断言错误。@maba,他说isA是出于某种原因,它捕获类,它接受class
,而不是class
(instanceOf就是这样做的). 由于它捕获了类,因此使用与实例不兼容的类执行isA将是一个编译时错误。从某种意义上说,原始的assertThat()
被推迟到Hamcrest,因此JUnit也可以与第三方断言库一起使用。我刚刚测试了这个答案,它是不正确的,并导致多个编译错误:表达式的非法启动,类型的非法启动,';'预期。。。换句话说,assertThat matcher的第二个参数不能是“instanceof(BaseClass.class)”!事实上,您甚至没有正确键入,您使用的语法略有不同-“InstanceOf(”-作为函数调用!实际上没有这样的函数…有人测试过吗?它似乎是手动输入的,没有任何tests@Carmageddon我提供了两个答案,一个是给Hamcrest的,另一个是给AssertJ的。你在说哪一个?@Carmageddon我怀疑你在谈论Hamcrest的例子,你错过了instanceOf
与instanceOf
一样(注意情况).instanceOf
是,而instanceOf
是。我当然提到了Hamcrest一个,我尝试了关键字和函数,因为我注意到你是这样写的-没有这样的函数…如果objectUnderTest是TargetObject的子类,这仍然会导致true
对吗?我想你要测试一下实际类型。我觉得这不是正确的答案。最初的问题是询问一些具体检查对象确切类型的东西。这个解决方案并不是这样的(正如上面@EircG所提到的),它甚至是由最初提问的用户提供的,所以肯定不是“正确的”回答imo。要获得正确的答案,请检查Franklin Yu的答案。好吧,它有@EricG提到的缺点,关于Franklin的答案是的-我只是看了看,它对我来说没有意义,所以我只是在我的项目中用Junit5测试了一下-它是错误的!!instanceof没有这样的语法,也没有一个叫做instanceof的方法!他是完全正确的我错了。我仍然坚持我的答案,事实证明,至少有30人投了赞成票!(我猜你投了反对票)@kekko12我的答案也不检查确切的类型;它接受与此答案类似的子类。我已经更新了我的答案来解决它;很抱歉,我没有注意到这一部分。我认为确切的相等性不包括在大多数断言库中,因为它不经常使用。@Carmageddon Franlin Yu的答案确实有效。@Carmageddone如果您使用hamcrest断言导入:``import static org.hamcrest.CoreMatchers.instanceOf;```根据他的代码示例导入ss。我承认,尽管我忽略了Franklin答案,但事实上,这两个答案都是函数
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));
}
}
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));
}
}
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);
}
}
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))
}
}
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)
}
}