我正在为一个基于Apache MINA的协议项目创建一个测试平台。在MINA中,当您接收数据包时,messageReceived()方法将获得一个对象。理想情况下,我希望使用JUnit方法assertClass(),但是它并不存在。我在尝试找出我能得到的最接近的东西。我正在尝试寻找类似于instanceof的东西。
目前我有:
public void assertClass(String msg, Class expected, Object given) {
if(!expected.isInstance(given)) Assert.fail(msg);
}要调用它,请执行以下操作:
assertClass("Packet type is correct", SomePacket.class, receivedPacket);这是没有问题的,但是在实验和玩这个的时候,我的兴趣被instanceof操作符达到了顶峰。
if (receivedPacket instanceof SomePacket) { .. }instanceof如何使用SomePacket来引用手头的对象?它不是一个对象的实例,它不是一个类,它是什么?!一旦确定了SomePacket在这一点上是什么类型,就可以扩展我的assertClass(),使其不必包含SomePacket.class参数,而是支持SomePacket
发布于 2009-06-06 01:05:37
instanceof的参数是一个类/接口名称,它直接作为JVM指令实现。因此,它是相当有效的。
http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.html#instanceof
instanceof而不是比较类的一个优点是,如果类已经被代理,instanceof仍然可以工作。
如果被检查的对象为空,它也会起作用。
发布于 2009-06-06 20:57:37
看看Hamcrest匹配器,现在包含在JUnit中。你想要的是这样的:
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.instanceOf;
assertThat(receivedPacket, instanceOf(SomePacket.class));这就完成了您需要的一切,包括断言失败时的一条像样的错误消息。
发布于 2009-06-06 00:27:39
为什么不直接使用assertEquals
assertEquals(SomePacket.class, given.getClass());https://stackoverflow.com/questions/958460
复制相似问题