2011-09-09 16 views
8

estoy usando Mockito para burlarse de un objeto con un método que devuelve un ArrayList un-parametrizada, y no puedo encontrar la manera de conseguir que esto funcioneLlamar a un método genérico java sobrecargada de Scala

firma del método de simulacro de

public java.util.ArrayList getX() 

código de ensayo

var mockee = mock(classOf[Mockee]) 
when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_]) 

Thi s realmente compila bien en IntelliJ, pero en tiempo de ejecución lanza:

[error] ....scala:89: overloaded method value thenReturn with alternatives: 
[error] (java.util.ArrayList[?0],<repeated...>[java.util.ArrayList[?0]])org.mockito.stubbing.OngoingStubbing[java.util.ArrayList[?0]] <and> 
[error] (java.util.ArrayList[?0])org.mockito.stubbing.OngoingStubbing[java.util.ArrayList[?0]] 
[error] cannot be applied to (java.util.ArrayList[_$1]) 
[error]  when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_]) 
+0

Puedo estar equivocado, pero pensé que 'ArrayList [_]' en Scala no es lo mismo que una ArrayList no parametrizada, es un tipo existencial, es decir, tiene un parámetro de tipo, pero está vinculado a un lugar divertido. Creo que el tipo no parametrizado sería 'ArrayList [AnyRef]', es decir, parametrizado por 'java.lang.Object'. – Owen

+1

Esto parece un error en tiempo de compilación, no un error en tiempo de ejecución. El tipo existencial de Scala 'ArrayList [_]' es su aproximación más cercana al tipo comodín de Java 'ArrayList '. En realidad tienes un * tipo crudo *, 'Lista de Arreglos'. Dos preguntas SO a tener en cuenta: [tipos existenciales de Scala] (http://stackoverflow.com/questions/1031042/scalas-existential-types) y [Tipos crudos y comodines ...] (http://stackoverflow.com/ preguntas/3489947/raw-types-unbounded-wilcard-and-bounded-wildcard) –

+0

Tiene razón, es un error de tiempo de compilación, pero no está resaltado por el complemento scala. Puedo solucionar esto usando 'thenAnswer (new Answer [ArrayList [_]] {def answer (arg: InvocationOnMock) = Lists.newArrayList (x)})' pero eso no es muy bueno –

Respuesta

8

Los siguientes obras para mí:

val mockee = mock(classOf[Mockee]) 
when[ArrayList[_]](mockee.getX).thenReturn(Lists.newArrayList) 

asumiendo la clase "listas" pertenece a las colecciones de Google (ahora guayaba).

+0

Perfecto - Nunca pensé en agregar el parámetro de método –

Cuestiones relacionadas