Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JUnit中创建assertClass()方法_Java_Junit - Fatal编程技术网

Java 在JUnit中创建assertClass()方法

Java 在JUnit中创建assertClass()方法,java,junit,Java,Junit,我正在为一个基于ApacheMina的协议项目创建一个测试平台。在MINA中,当您接收数据包时,messageReceived()方法获取一个对象。理想情况下,我希望使用JUnit方法assertClass(),但它并不存在。我在到处玩,想弄清楚什么是我能得到的最接近的。我正试图找到类似于instanceof的东西 目前我有: public void assertClass(String msg, Class expected, Object given) { if(!expecte

我正在为一个基于ApacheMina的协议项目创建一个测试平台。在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

SomePacket是一种类型,如下所示:

 SomePacket something = null;
您不能在运行时以您想要的方式直接引用它。类对象是我知道的唯一方法。

仅供参考,您可以查看

if(given == null || given.getClass() != expected)
检查给定的
类是否与所需的
类完全一致,而不仅仅是作业兼容。
我将这一类称为assertClass和您最初的建议assertInstance或assertInstanceOf

回应评论:
我的回答只是一般性的提示,而不是对你原来问题的回答。我添加了一个“供参考”以更清楚地说明这一点;)

取决于你到底想要什么,这两种方法可能都是合理的

在下面的示例中

public class Base {}
public interface Ifc {}

public class A{} extends Base implements Ifc
public class B{} extends Base
上述方法的行为如下

A a=new A();
B b=new B();

assertClass(A.class, a);
assertClass(Base.class, a); // fails, a.getClass() != Base.class
assertClass(Ifc.class, a); // fails, a.getClass() != Ifc.class
assertClass(B.class, b);
assertClass(Base.class, b); // fails, b.getClass() != Base.class
assertClass(Ifc.class, b); // fails, b.getClass() != Ifc.class

assertInstance(A.class, a);
assertInstance(Base.class, a); // works
assertInstance(Ifc.class, a); // works
assertInstance(B.class, b);
assertInstance(Base.class, b); // works
assertInstance(Ifc.class, b); // fails, B does not implement Ifc
您很可能希望使用您的方法进行检查。

但是,如果您想验证确切的类,例如确保它未被代理或不是扩展类,我的建议是这样做的方法。

为什么不直接使用
assertEquals

assertEquals(SomePacket.class, given.getClass());

instanceof的参数是一个类/接口名,它直接作为JVM指令实现。因此,它是相当有效的

instanceof代替比较类的一个优点是,如果类已被代理,instanceof仍然可以工作


如果要检查的对象为null,它也会工作。

看看现在包含在JUnit中的Hamcrest匹配器。您想要的是:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.instanceOf;

assertThat(receivedPacket, instanceOf(SomePacket.class));
这就完成了您所需要的一切,包括断言失败时的一条适当的错误消息

assertThat(expected).isInstanceOf(given.class);

使用FEST Assertions 2.0是一个Java库,可用于轻松的软件测试,如下所示:

问题更令人感兴趣-instanceof如何直接引用类?FWIW我可能最终不得不使用assertEquals()。主要问题是可能出现错误。很容易忘记使用.getClass()。不过,用一个接受对象并调用.getClass()的方法编写多个方法显然可以解决这个问题。方法名称的准确性并不是我想要得到的答案。也许我最后的问题清单不清楚。我更感兴趣的是instanceof如何引用对象。我开始认为JVM会这样做:if(o instanceof Obj)==if(o.getClass().equals(Obj.class))?我更新了我的答案。如果(o Obj实例)!=如果(o.getClass().equals(Obj.class))!通常(除了特殊的类加载器处理),您可以安全地与(o!=null&&Obj.class==o.getClass())进行比较,顺便说一句,谢谢!我想这和我想的一样-我无法复制类似的结果,必须调用.getClass()并进行比较。回答不同的问题-但这是一个答案:)谢谢Steve。应该是
assertThat(receivedPacket,instanceOf(SomePacket.class))
(注意
.class