2012-04-25 18 views
10

私がテストしたい方法はbListの各要素のためのロジックを持つforループを持っています次のとおりです:MockitoにClassCastException

java.lang.ClassCastException: 
org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$ cannot be cast to xyz.B

これまで誰かが遭遇しましたが、回避策がありますか?私は解決策を探していると、いくつかのリンクを渡ってきた

http://code.google.com/p/mockito/issues/detail?id=251http://code.google.com/p/mockito/issues/detail?id=107

+0

リンクで指摘されている既存の問題である可能性があります。 –

+2

あなたは本当にList and Mapを模擬しようとしていますか、それとも問題を説明するだけですか?なぜあなたはArrayListとHashMapの実装を使用してそれらを注入しないのですか? – jhericks

+0

@ jhericksはい、あなたは正しいです、私はArrayListとHashMapの実装を使用するに切り替える必要があります。ありがとうございます –

答えて

18

this link you postedが示すように、あなたはAnswers.RETURNS_DEEP_STUBSでバグが発生しました 。

実際にはRETURNS_DEEP_STUBSをサンプルコードに使用する理由はありません。 Mockito docs sayのように、「モックがモックを返すたびに、妖精が死んでしまうので、あなたは深いスタブが必要かどうかを本当に評価するべきです。そうすることができれば、それを取り出して、あなたの例がうまくいくでしょう。

しかし、深いスタブの使用を主張する場合は、メソッド呼び出しの戻り値をObjectにアップキャストすることでこのエラーをハックすることができます。たとえば、コード内の問題のある行を次のように置き換えます。

when((Object)bList.get(0)).thenReturn(b); 

すべてのことは、私は個人的に@jhericksに同意します。最高の解決策はおそらくを嘲笑ではなく模擬を含む実際のArrayListを使用することです。唯一の問題は、あなたのリストを注入することです。だから、@Spyを使わなければなりません。たとえば、

@RunWith(MockitoJUnitRunner.class) 
class ATest{ 
    private B b = mock(B.class); 
    @Spy 
    private List<B> bList = new ArrayList<B>() {{ add(b); }}; 

    @InjectMocks 
    private C c = new C(); 

    @Test 
    public void test(){ 
    c.methodIWantToTest(); 
    // verify results 
    } 
} 
+0

私は両方の選択肢を試して、両方とも動作します。私はMockitoの文書に記載されているようなケースを見て、モックを返すためにモックを使用することを控えます。ありがとう。 –

1

実際には、クラスパスの問題とリレーを検索します。 mockitoメーリングリストとIssue Trackerでは、不正なクラスパス(間違ったバージョンのjarなど)やクラスの再読み込み(いくつかのjarファイルは再読み込みされていましたが、mockitoではなく、クラスのインスタンス化間違ったクラスローダーで)。

@Acesあなたは

+0

私は、MockをArrayListとHashMapの実装に置き換えました。また、答えに示唆されているようにアップキャストでハックを試みました。どちらのソリューションもうまくいきました。だから私はプロジェクトにクラスパスの問題はないと思う。私は今までモックを使ってテストケースを実行することができました。 –

0

(...達人、スペック、確実な、フレームワークを再生、JRebel多分、など)のバージョンと使用しているツールの名前のように、より多くの詳細を与えることができる残念ながら、これではありません可能

ケース:APIのテスト:この用法の

interface ConfigurationBuilder {...} 
configurationBuilder.newServerAction("s1").withName("111")....create(); 

主な理由は、コンパイル時に互換性の維持です。例の

Builder/*<ServerActionBuilder>-erasured generic*/ b = configurationBuilder.newServerAction("s1"); 
b.withName("111")...create(); 

結果は上記にserveractionする必要がありますが、mockitoにそれが生成されたクラスのオブジェクトは、次のとおりです。 しかしmockitoはJavaで消去を入力によるRETURNS_MOCKSとRETURNS_DEEP_STUBSオプションを持つチェーンでジェネリックをサポートすることはできません。

Issue: Can not Return deep stubs from generic method that returns generic type #484