2010-07-15 7 views
14

우리는 Spring 3.0으로 전환하고 Spring 3.0, EasyMock 및 Java Generics의 교차점에서 문제가 발생하는 것을보고 있습니다. 한 곳에서Wildcarded generic을 반환하는 메서드로 EasyMock 호출하는 방법?

, 우리는 특히이 방법, 봄 3.0 AbstractBeanFactory을 조롱하고 있습니다 : 봄의 이전 버전에서

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

이는 제네릭이 아닌 반환하고 모두 잘했다. 일반으로, 그러나, 우리는이에 문제로 실행 andReturn 단순히 제대로 작동하지 않는 매개 변수로 Class<?>을 필요로

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

, Class<?> 반환 getType 때문입니다.

알려진 해결 방법이 있습니까?

+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

왜 이런 일이 일어나는가에 대한 나의 추측은 EasyMock의'expects()'에서 반환되는 와일드 카드 유형이 'andReturns()'에서 리턴 된 와일드 카드 유형과 동일한 유형이어야합니다. 구현시에는 컴파일러에서 처리 할 와일드 카드가 하나만 있습니다. 메서드의 반환 유형입니다. EasyMock이 설정되는 방식에는 두 개의 와일드 카드가 필요합니다 : 기대되는 리턴 유형과 실제 리턴 유형. 그리고 각 유형에 와일드 카드가있는 경우, – Trent

1

전송 및 경고를 피하는 가장 쉬운 방법은 expect(..) 대신 expectLastCall()을 사용하는 것입니다 (자세한 내용은 my answer to a similar question 참조). 그래서이 경우

:

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