2016-07-29 21 views
-1

Ich habe eine Methode, die ich versuche, Einheitstest mit Mocks. Hier ist die Methode:Fehler beim Versuch, eine Karte zu stubben

{... 
     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; 
} 

Und was ich versuche, die erste Zeile Stummel zu tun, so dass mapMasterMap eine gültige Karte enthält (und die codeMap.gets nicht sprengen) - wie:

{ 
    @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(){} 

ich erhalte eine Fehlermeldung:

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

Also, erstens - verfolge ich den richtigen Ansatz? Wenn ja, wie kann ich das beheben?

+2

Zunächst einmal, verwenden Sie nicht [die Doppel-Klammer-Muster] (https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti- Muster /) - es ist eine Quelle von Speicherlecks unter anderen Problemen. [Guavas "ImmutableMap"] (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) hat ein fließendes Builder-Muster, wenn Sie eine "Map" inline erstellen möchten. – dimo414

+0

Warum haben Sie auch nur einen Teil Ihrer Methode hinzugefügt? Was ist die Methodensignatur? Welcher Typ ist 'mav'? Was ist "blah"? Wenn Sie Probleme bei der Kompilierung haben, ist die Freigabe des echten Codes, den Sie zu kompilieren versuchen, ein notwendiger erster Schritt, um nützliche Anleitungen zu erhalten. – dimo414

+0

mav ist ModelAndView - Ich entfernte Ruhe, weil diese für die Frage irrelevant schien. – user2666282

Antwort

1

Die Meldung sagt alles: Sie können nicht thenReturn ein HashMap<String, MasterVO> wo Java für eine Map<String,Object> fragt, was Mockito vom Rückgabetyp getMasterData ableitet. Sie müssen eine HashMap<String, Object> oder eine andere Map<String, Object> übergeben, die in Ihrem Fall so einfach ist, wie den Typ in Ihrem Stubbing-Anruf zu ändern.

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

Warum? In Java, generics are not covariant: Auch wenn MasterVO notwendigerweise Object erweitert, können Sie nicht eines anstelle des anderen verwenden. Sonst könnte man dies ganz einfach:

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! 

Hinweis: Wie dimo414 erwähnt, keine Doppel Klammer Syntax. Es erstellt eine unnötige Java-Klasse und kann Speicher verlieren.

+0

danke - also jetzt, wenn ich es versuche - 'when (this.sysAdminService.getPaymentMasterData()) .thenReturn (ImmutableMap.of ("mvo", (Object) this.masterVO));' Ich bekomme immer noch eine ClassCastException an: 'final Map codeMap = (Karte ) mapMasterMap .get ("mvo");' - user2666282 vor 6 Minuten – user2666282

+0

Sorry, ich habe einen Tippfehler gemacht - danke @Jeff Bowman – user2666282

Verwandte Themen