2009-08-20 8 views
2

私はユニットテストで使用するオブジェクトを作成するファクトリメソッドを持っています。これらのオブジェクトはすべて、同じ基本クラスから派生:Javaでは、Classオブジェクトから匿名サブクラスのインスタンスを作成できますか?

public static <T extends BaseEntity> T modMake(Class<T> clazz) 
{ 
    try { 
     return clazz.newInstance(); 
    } catch (InstantiationException e) { 
     // Should never happen 
     throw new AssertionError(e); 
    } catch (IllegalAccessException e) { 
     // Should never happen 
     throw new AssertionError(e); 
    } 
} 

は今、私は、基本クラスから、ちょうどテストのためのゲッターメソッドをオーバーライドします。私は通常、匿名クラスとそれを行うだろう(BaseEntityのsubtaypesの1つであるNode)例えば:

public static Node nodMake() 
{ 
    return new Node() { 
     @Override 
     public long ixGet() { return 1; } 
    }; 
} 

私は行うことができますあまりにも、Class引数を使って関数内の?

答えて

3

ファクトリメソッドを失い、EasyMockのようなモックAPIを使用して、記述した動作を実現します。それはあなたがインターフェイスまたはクラスをあざけるかどうかに依存

:これはどのように機能するかについてハンノの質問に答えるために

long returnValue = 12; 

Node nodeMock = createMock(Node.class); 
expect(nodeMock.ixGet()).andReturn(returnValue); 
replay(nodeMock); 

//add test code here 

verify(nodeMock); 

あなたのコードは、このような何かをすることになります。

の場合、はシンプル(コードワイズ)で、コアJavaの一部であるダイナミックプロキシを使用しています。

クラスの場合、では、@Jonathanが答えたところで、素晴らしいAPIの背後にあるバイトコード操作を行っています。

上記のメカニズムを使用すると、メソッド呼び出しを傍受することができ、EasyMockは設定した期待に基づいて応答します。

+0

興味深い。私はこのようにJavaを使用していませんでした。 –

+0

私は実際にEasyMockを使用しています。ありがとう! –

0

私はそれを行う方法はないと思います。本当にそのルートに行く必要があれば、おそらくバイトコードマニピュレータを調べる必要があります。 JavassistとBCELはいくつかの選択肢です。

関連する問題