2010-07-15 4 views
14

Мы смотрим на переход на Spring 3.0 и проблемы с пересечением Spring 3.0, EasyMock и Java Generics.Как EasyMock вызов метода, который возвращает подстановочный знак?

В одном месте мы насмешливые в AbstractBeanFactory Spring 3.0, в частности, этот метод:

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

В рамках предыдущих версий Spring, это возвращает нетипичное и все было хорошо. С родовым, однако, мы столкнулись с проблемами с этим:

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

Поскольку getType возвращает Class<?>, andReturn требует Class<?> в качестве параметра, который просто не работает должным образом.

Есть ли известное обходное решение?

+0

не это просто возвращает предупреждение? –

+0

@matt Это ошибка компилятора. –

ответ

20

Я столкнулся с такой проблемой, как раньше, с Mockito. Я не знаю, почему это происходит. Вы можете привести аргумент ожидать (..) в необщего типа класса, ала

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

Тогда вы просто предупреждение, которое вы можете подавить, если вы хотите. Не очень изящное решение; Я собираюсь потратить еще несколько минут на это.

+5

Это делает трюк. К сожалению, я пришел к ожиданию неэлегантных решений при работе с Java Generics. –

+4

+1 для вас обоих. @AlanKrueger - Я не могу +1 этого достаточно. Я потратил 20 минут *, пытаясь выяснить, как искать эту проблему *: P – arootbeer

+0

Мое предположение о том, почему это происходит, заключается в том, что Java не может быть уверенным, что тип подстановочного знака, который возвращается из 'expects()' 'EasyMock', будет быть тем же типом, что и тип подстановочного знака, который возвращается из 'andReturns()'. В реализации для компилятора есть только один подстановочный знак: возвращаемый тип метода. Как настроить EasyMock, должны быть две подстановочные знаки: ожидаемый тип возвращаемого значения и фактический тип возврата. И когда в каждом типе есть подстановочный знак, – Trent

1

Простейшая вещь, чтобы избежать кастинга и предупреждений, заключается в использовании expectLastCall() вместо expect(..) (см. my answer to a similar question).

Так что в этом случае:

mockBeanFactory.getType(CLASS_NAME); 
expectLastCall().andReturn(SOME_CLASS); 
Смежные вопросы