2009-06-05 12 views
3

Apache MINAに基づいたプロトコルプロジェクト用のテストプラットフォームを作成しています。パケットを受信したMINAでは、messageReceived()メソッドはObjectを取得します。理想的には、JUnitメソッドassertClass()を使用したいと思いますが、存在しません。私は私が得ることができる最も近いものを解決しようとしています。 instanceofと似たようなものを見つけようとしています。JUnitでassertClass()メソッドを作成する

現在、私は持っている:

public void assertClass(String msg, Class expected, Object given) { 
    if(!expected.isInstance(given)) Assert.fail(msg); 
} 

この呼び出すには:これは、しかし、実験と、この私の興味はinstanceofオペレータがピークに達したと一緒に遊んで、問題なく動作します

assertClass("Packet type is correct", SomePacket.class, receivedPacket); 

を。

if (receivedPacket instanceof SomePacket) { .. } 

instanceofはどのようにしてSomePacketを使用して手元のオブジェクトを参照できますか?それはオブジェクトのインスタンスではなく、クラスではありません、それは何ですか?その時点でタイプSomePacketを設定したらassertClass()SomePacket.class引数を含める必要はなく、代わりにSomePacketを優先させることができますか?

答えて

0

instanceofの引数は、クラス/インタフェース名であり、それはJVMの命令として直接実装されています。それはかなり効率的です。 instanceofは代わりにクラスを比較するの

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.html#instanceof

一つの利点は、クラスがプロキシされた場合のinstanceofはまだ動作するということです。

検査対象のオブジェクトがnullの場合にも機能します。

+0

ありがとう!私はそれが私が思った通りだと思います - 私は同様の結果を複製することはできませんし、.getClass()を呼び出してその方法で比較する必要があります。 – Mike

0

SomePacketはこのように、タイプです:

SomePacket something = null; 

あなたが望む方法で、実行時にそれを直接参照することはできません。クラスオブジェクトは私が知っている唯一の方法です。

0

FYI、あなたはgivenのクラスは正確クラスexpectedだけでなく、代入互換性があるかどうかを確認するために

if(given == null || given.getClass() != expected) 

をチェックすることができます。
私はこれをassertClassと、あなたのオリジナル提案assertInstanceまたはassertInstanceOfと呼びます。
私の答えはなく、あなたの元の質問への答えとして、一般的なヒントとして意図したコメントに応えて

。 )

正確に何を望むかによって、どちらの方法も妥当かもしれません。

上記のメソッドの動作は、ほとんどの場合、あなたの方法で確認することをお勧めします。この

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 

ようになり、次の例

public class Base {} 
public interface Ifc {} 

public class A{} extends Base implements Ifc 
public class B{} extends Base 

で。
正確なクラスを検証する場合は、 にプロキシされていないこと、またはでないことを確認するには、私の提案がその方法になります。

+0

メソッドの名前の精度は、私は答えを取得しようとしているものではありません。おそらく私の最後の質問リストは明らかではありませんでした。 instanceofがオブジェクトを参照する方法についてもっと興味があります。 (OBJのinstanceofはO)の場合== (o.getClass()のequals(Obj.class)。)の場合 :私は、JVMはこのような何かを考え始めていますか? – Mike

+0

私は自分の答えを更新しました。 if(o instanceof Obj)!= if(o.getClass()。equals(Obj.class))!通常(特別なClassLoaderを扱う)、(o!= null && Obj.class == o.getClass())、btwと安全に比較できます。 – Huxi

2

なぜassertEqualsを使用しないのですか?

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

質問にはもっと関心があります - どうしてinstanceofがクラスを直接参照するのですか? FWIWおそらくassertEquals()を使用する必要があります。主な問題はエラーの可能性です。 .getClass()を忘れるのは簡単です。 Objectをとり、.getClass()を呼び出す複数のメソッドを記述することで、この問題を解決することができます。 – Mike

24

JUnitに含まれているHamcrestマッチャーを見てください。あなたが欲しいのは次のようなものです:

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

assertThat(receivedPacket, instanceOf(SomePacket.class)); 

アサーションの失敗時にまともなエラーメッセージを含め、すべてが必要です。 FESTアサーション2.0を使用して

+0

別の質問に答える - それは答えです:)スティーブありがとうございます。 – Mike

+0

それは 'assertThat(receivedPacket、instanceOf(SomePacket.class));'( '.class'に気づく) – robinst

+0

修正してください、ありがとう –

関連する問題