2010-07-15 8 views
14

Stiamo valutando il passaggio a Spring 3.0 e l'esecuzione di problemi con l'intersezione di Spring 3.0, EasyMock e Java Generics.Come chiamare EasyMock su un metodo che restituisce un generico con caratteri jolly?

In un unico luogo, stiamo beffardo un AbstractBeanFactory Primavera 3.0, in particolare questo metodo:

public Class<?> getType(String name) throws NoSuchBeanDefinitionException { ... } 

con le versioni precedenti di primavera, questo restituisce una non generica e tutto andava bene. Con il generico, tuttavia, ci imbattiamo in problemi con questo:

expect(mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS); 

Perché getType rendimenti Class<?>, andReturn richiede Class<?> come parametro, che semplicemente non funziona correttamente.

Esiste una soluzione nota a questo?

+0

Non sarebbe questo solo restituire un avvertimento? –

+0

@matt Si tratta di un errore del compilatore. –

risposta

20

Ho incontrato un problema simile prima con Mockito. Non sono sicuro del perché accada ancora. Si può lanciare l'argomento si aspettano (..) per il tipo di classe non generico, ala

expect((Class) mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS); 

Poi dovrete semplicemente un avvertimento, che è possibile sopprimere se si vuole. Non è una soluzione molto elegante; Passerò ancora qualche minuto a guardarlo.

+5

Questo fa il trucco. Purtroppo, mi sono aspettato soluzioni ineleganti quando si trattava di Java Generics. –

+4

+1 a tutti e due. @AlanKrueger - Non posso fare +1 su abbastanza. Ho speso 20 minuti * cercando solo di capire come cercare questo problema *: P – arootbeer

+0

La mia ipotesi sul perché questo accada è che Java non può essere sicuro che il tipo di carattere jolly che viene restituito da 'expect() 'di EasyMock essere dello stesso tipo del tipo di carattere jolly che viene restituito da 'andReturns()'. Nell'implementazione, c'è solo un carattere jolly da usare per il compilatore: il tipo di ritorno del metodo. Il modo in cui EasyMock è impostato, è necessario che siano presenti due caratteri jolly: il tipo di reso previsto e il tipo di reso effettivo. E quando c'è un jolly in ogni tipo, – Trent

1

La cosa più semplice da evitare qualsiasi trasmissione e avviso è utilizzare expectLastCall() anziché expect(..) (vedere my answer to a similar question per dettagli).

Quindi in questo caso:

mockBeanFactory.getType(CLASS_NAME); 
expectLastCall().andReturn(SOME_CLASS); 
Problemi correlati