2011-12-30 1 views
0

は、私はこのようなモックセットアップを持って言う:JMockモックオブジェクトがどのクラスを嘲笑しているかをどのようにして判断できますか?

JUnit4Mockery context = new JUnit4Mockery(); 
MyInterface mock = context.mock(MyInterface.class); 

以降、私はそれをからかっ何クラスを見つけるために私のモックオブジェクトを調べたい:

Class mockedClass = mock.??? //would return MyInterface.class 

私は何も表示されませんでしたmockメソッドのシグネチャが(私は1.2.0を見た)以前のバージョンyの

<T> T mock (Class<T> typeToMock) 

ある - これを行う方法についてJMock(2.5.1)のJavadocに明らかOUは、直接Mockオブジェクトを作成し、及びその方法の一つは、私は何を達成しようとしていることは、私のユニットテスト内のDIを使用するためのユニットテストフレームワークです

Class getMockedType() 

ました。 (私はGuice 3.0を使用しています)テストでDIを使用することは、私が使用しているアプリケーションサーバー/プラットフォームの制限です。テスト対象のオブジェクトは、自分自身のInjectorを持つマルチタスクのサブクラスです。移入しようとしています。

私はすべてのテストにAbstractModuleの匿名のインスタンスを作成する必要がないことを好むだろう、私は(それが1.2で働いていたように、これはそうです)このような何かを構築しようとしている:

public class MockModule extends AbstractModule { 
    private Iterable<Mock> mocks; 

    public MockModule(Iterable<Mock> mocks) { 
     this.mocks = mocks; 
    } 

    protected void configure() { 
     for (Mock mock : mocks) { 
      bind(mock.getMockedType()).toInstance(mock); 
     } 
    } 
} 

唯一欠けているのは、この質問に答えがある場合です。 ACCEPTEDのANSWERここ

TO

応答は、私は、このユースケースのために作成することになったものです:

import java.lang.reflect.Proxy; 
import com.google.common.collect.Lists; 
import com.google.inject.AbstractModule; 

@SuppressWarnings({ "rawtypes", "unchecked" }) 
public class MockModule extends AbstractModule { 
    private final Iterable mocks; 

    public MockModule(Object mock) { 
     mocks = Lists.newArrayList(mock); 
    } 

    public MockModule(Iterable mocks) { 
     this.mocks = mocks; 
    } 

    protected void configure() { 
     for (Object mock : mocks) { 
      Class superclass = mock.getClass().getSuperclass(); 
      if (superclass != Object.class && superclass != Proxy.class) { 
       bind(superclass).toInstance(mock); 
       continue; 
      } 
      Class[] interfaces = mock.getClass().getInterfaces(); 
      if (interfaces.length > 0) { 
       bind(interfaces[0]).toInstance(mock); 
      } 
     } 
    } 
} 

答えて

1
Class mockedClass = mock.getClass().getInterfaces()[0]; 
System.out.println("Class is " + mockedClass.getCanonicalName()); 

が印刷されます:

Interface is MyInterface 

多分もっとありますがそれを行う堅牢な方法ですが、この特定の少なくともJMockのバージョン。

+0

ありがとうございました!誰かがもっと頑強なバージョンを提案できるかどうかを待つつもりですが、これは間違いなく私に正しい方向を指摘してくれます。 – arootbeer

+0

もう1つのアプローチは、モックオブジェクトに余分なインターフェースを追加してクラスを照会するカスタムImposteriserを作成することです。 –

+0

私はその考えが本当に好きです...私はそれを調べます。 – arootbeer

0

私はこれを行うためのあなたの動機を理解していません。 JMockは、オブジェクトまたはオブジェクトの小さなクラスタをユニットテストするために従来から使用されています。つまり、テストですべてが新しくなりました。 DIは通常、実際のコンポーネントのように見えるものを動かすと、統合テストまたは受け入れテストのレベルで起動します。

テストでDIを使用して何を表示しようとしていますか?

+0

私がテストしているオブジェクトはGuiceの 'Injector'を内部的に使っています(サブクラスが提供するサービスです)。私はそれらをテストするためにインジェクタに私のモックを配置しなければなりません。私はまだオブジェクトの直接の依存関係をテストしています。それはオブジェクト自体がDIを使用して作成されず、むしろ私たちの正気のためにDIを消費するということです。 – arootbeer

+0

私はコードを見ていませんが、私の標準的な応答は、テストがあなたに設計について何かを伝えようとしているということです... –

+0

私は完全に同意します。しかし、これらのオブジェクトの作成は実行時に制御できませんので、私の意見ではDIをまったく取得するだけで勝利です。 – arootbeer

関連する問題