2011-09-09 2 views
8

Я использую Mockito издеваться объект с методом, который возвращает не-параметризованных ArrayList, и я не могу понять, как заставить это работатьВызов перегруженного Java общий метод из Скале

Метод подписи фиктивный

public java.util.ArrayList getX() 

код испытания

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

Thi s фактически составляет штраф в IntelliJ, но во время выполнения броска:

[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

Возможно, я ошибаюсь, но я думал, что 'ArrayList [_]' в Scala не совпадает с непараметрированным ArrayList, это экзистенциальный тип, т. Е. Имеет параметр типа, но он связан в забавном месте. Я думаю, что непараметрированный тип будет 'ArrayList [AnyRef]', т.е. параметризованным 'java.lang.Object'. – Owen

+1

Это выглядит как ошибка времени компиляции, а не ошибка времени выполнения. Экзистенциальный тип Scala 'ArrayList [_]' является его ближайшим приближением к подстановочному типу Java 'ArrayList '. У вас на самом деле есть * raw type *, 'ArrayList'. Два вопроса SO, на которые нужно обратить внимание: [Экзистенциальные типы Scala] (http://stackoverflow.com/questions/1031042/scalas-existential-types) и [Необработанные типы и подстановочный знак ...] (http://stackoverflow.com/ вопросы/3489947/raw-types-unbounded-wilcard-and-bounded-wildcard) –

+0

Вы правы, это ошибка времени компиляции, но не подчеркнута плагином scala. Я могу обойти это, используя 'thenAnswer (новый ответ [ArrayList [_]] {def answer (arg: InvocationOnMock) = Lists.newArrayList (x)})', но это не очень хорошо –

ответ

8

следующие работы для меня:

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

предполагающие класс «Списки» от коллекций Google (в настоящее время гуава).

+0

Perfect - я никогда не думал добавлять параметр метода –