2016-07-29 28 views
-1

私はモックを使って単体テストしようとしています。ここでの方法である:マップをスタブしようとしたときにエラーが発生しました

{... 
     mapMasterMap = this.sysAdminService.getMasterData(); 

     final Map<String, MasterVO> codeMap = (Map<String, MasterVO>) mapMasterMap 
       .get("mvo"); 
     final Map<String, String> sessionMap = (Map<String, String>) mapMasterMap 
       .get("smap"); 
     dataVO.setSessionMap(sessionMap); 
     dataVO.setVO1(codeMap.get("vo1")); 
     dataVO.setVO2(codeMap.get("vo2")); 
     sCommand.setDataVO(dataVO); 
    } catch (final Exception e) { 
     return mav; 
    } 
    return mav; 
} 

そして、何私はmapMasterMapが有効なマップが含まれています(とcodeMap.getsが爆破していない)ように、第一のラインスタブされてやろうとしています - のような:

{ 
    @Mock 
    private MasterVO masterVO; 
     @Mock 
    private SysAdminService sysAdminService; 


    @InjectMocks 
    private SysAdminController sysAdminController; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
       when(this.sysAdminService.getMasterData()) 
       .thenReturn(new HashMap<String, MasterVO>() {{ 
        this.put("mvo",this.masterVO); 
       }}; 
    } 

    @Test 
    public final void testType(){} 

私はエラーを取得しています:

だから、

The method thenReturn(Map<String,Object>) in the type OngoingStubbing<Map<String,Object>> is not applicable for the arguments (new HashMap<String,MasterVO>(){})

、まず - 私は正しいアプローチを以下のよ? 「はい」の場合、これをどのように修正できますか?

+2

まず、[二重ブレースパターン]を使用しないでください(https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-パターン/) - それは他の問題の中でもメモリリークの原因です。 [Guavaの 'ImmutableMap'](https://github.com/google/guava/wiki/ImmutableCollectionsExplained)は、' Map'をインラインで構築したいときに流暢なビルダーパターンを持っています。 – dimo414

+0

また、あなたのメソッドの一部だけを含めたのはなぜですか?メソッドのシグネチャは何ですか? 'mav'はどんなタイプですか? 'まあまあ'とは何ですか?コンパイルの問題がある場合は、コンパイルしようとしている実際のコードを共有することは、有用なガイダンスを得るための最初のステップです。 – dimo414

+0

mavはModelAndViewです - 私は残りの部分を削除しました。なぜなら、それらは質問に無関係だったからです。 – user2666282

答えて

1

メッセージの内容は次のとおりです。thenReturnHashMap<String, MasterVO>ここでJavaはMap<String,Object>を返します.Mockitoは返品タイプgetMasterDataから派生しています。 HashMap<String, Object>またはその他のMap<String, Object>を渡す必要があります。この場合、スタビング呼び出しのタイプを変更するのと同じくらい簡単です。

when(this.sysAdminService.getMasterData()) 
    .thenReturn(new HashMap<String, Object>() {{ 
     this.put("mvo",this.masterVO); 
    }}); 

なぜですか? Javaの場合generics are not covariant:MasterVOは必然的にObjectを拡張しますが、ObjectVOを必ずしも拡張する必要はありません。

Map<String, MasterVO> stubMap = new HashMap<String, MasterVO>(); 
when(this.sysAdminService.getMasterData()).thenReturn(stubMap); 
Map<String, Object> returnedMap = this.sysAdminService.getMasterData(); 

// now returnedMap == stubMap, except you've lost some safety 
returnedMap.put("and this is why", "generic types are not covariant"); // legal 
MasterVO exceptItIsnt = stubMap.get("and this is why"); // ClassCastException! 

注:そうでなければ、これを簡単に行うことができ dimo414が述べたように、二重括弧構文を使用しないでください。不要なJavaクラスが作成され、メモリがリークする可能性があります。

+0

感謝 - 今私がしようとする - '(this.sysAdminService.getPaymentMasterData()).thenReturn(ImmutableMap.of( "mvo"、(Object)this.masterVO));私はまだClassCastExceptionを取得しています: 'final Map codeMap =(Map )mapMasterMap .get( "mvo");' - user2666282 6分前 – user2666282

+0

申し訳ありませんが、私は誤植をしました - ありがとう@ジェフボウマン – user2666282

関連する問題