2010-07-15 17 views
14

Estamos considerando cambiar a Spring 3.0 y tener problemas con la intersección de Spring 3.0, EasyMock y Java Generics.Cómo activar EasyMock una llamada a un método que devuelve un genérico wildcarded?

En un solo lugar, nos estamos burlando un AbstractBeanFactory Spring 3.0, específicamente este método:

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

En las versiones anteriores de la primavera, este devuelve un no genérico y todo estaba bien. Con el genérico, sin embargo, nos encontramos con problemas con esto:

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

Debido getType vuelve Class<?>, andReturn requiere Class<?> como un parámetro, que simplemente no funciona correctamente.

¿Existe una solución conocida para esto?

+0

No sería esto simplemente devolver una advertencia? –

+0

@matt Es un error del compilador. –

Respuesta

20

Me he encontrado con un problema como este antes, con Mockito. No estoy seguro de por qué sucede todavía. Puede emitir el argumento de esperar que (..) para el tipo de clase no genérica, ala

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

Entonces vas a tener una advertencia, que se puede suprimir si lo desea. No es una solución muy elegante; Voy a pasar unos minutos más mirándolo.

+5

Eso hace el truco. Tristemente, he llegado a esperar soluciones poco elegantes al tratar con Java Generics. –

+4

+1 a ambos. @AlanKrueger - No puedo hacer +1 suficiente. Pasé 20 minutos * tratando de descubrir cómo buscar este problema *: P – arootbeer

+0

Supongo que por qué sucede esto es que Java no puede estar seguro de que el tipo de comodín que se devuelve desde '' expect() 'de EasyMock ser del mismo tipo que el tipo de comodín que se devuelve de 'andReturns()'. En la implementación, solo hay un comodín para el compilador: el tipo de devolución del método. La forma en que EasyMock está configurado, debe haber dos comodines: el tipo de devolución esperada y el tipo de devolución real. Y cuando hay un comodín en cada tipo, – Trent

1

Lo más fácil para evitar cualquier casting y advertencias es usar expectLastCall() en lugar de expect(..) (ver my answer to a similar question para más detalles).

Así que en este caso:

mockBeanFactory.getType(CLASS_NAME); 
expectLastCall().andReturn(SOME_CLASS); 
Cuestiones relacionadas