2012-04-25 2 views
10

I 테스트 할 방법은이 bList 각 요소의 논리 루프 갖는다 다음과 같습니다.Mockito ClassCastException이

이전에 누군가가 발생 했습니까? 내가 솔루션을 검색하고 어떤 링크를 통해 온

: http://code.google.com/p/mockito/issues/detail?id=251http://code.google.com/p/mockito/issues/detail?id=107

+0

그것은 기존의 문제가 될 수 있습니다 참조하십시오. –

+2

정말 List and Map을 모의하려고합니까 아니면 문제를 설명하기위한 것입니까? ArrayList와 HashMap 구현체를 사용하고 삽입하는 것은 어떨까요? – jhericks

+0

@ jhericks 네, 맞습니다. ArrayList와 HashMap 구현을 사용하도록 전환해야합니다. 감사합니다 –

답변

18

this link you posted 알 수 있듯이, 당신은 Answers.RETURNS_DEEP_STUBS에 버그가 발생했습니다 .

예제 코드에서 실제로 RETURNS_DEEP_STUBS을 사용할 이유가 없습니다. 깊은 스텁이 필요한지 여부를 평가해야합니다. 왜냐하면 Mockito docs say처럼 "모의가 반환 될 때마다 요정이 죽습니다." 그렇게 할 수 있다면 그냥 꺼내면 예제가 효과가 있습니다.

그러나 깊은 스텁 사용을 주장하는 경우 메서드 호출의 반환 값을 Object으로 업 캐스팅하여이 오류를 해결할 수 있습니다. 예를 들어 코드의 문제가있는 행을 다음으로 대체하십시오.

when((Object)bList.get(0)).thenReturn(b); 

나는 모두 개인적으로 @jhericks에 동의합니다. 가장 좋은 해결책은 아마도 List을 조롱하는 것과 반대되는 모의가 들어있는 실제 ArrayList을 사용하는 것입니다. 유일한 문제는 목록을 주입하는 것이므로 @Spy을 사용해야합니다. 예를 들면 다음과 같습니다.

@RunWith(MockitoJUnitRunner.class) 
class ATest{ 
    private B b = mock(B.class); 
    @Spy 
    private List<B> bList = new ArrayList<B>() {{ add(b); }}; 

    @InjectMocks 
    private C c = new C(); 

    @Test 
    public void test(){ 
    c.methodIWantToTest(); 
    // verify results 
    } 
} 
+0

나는 두 대안을 모두 시도하고 그들은 모두 작동합니다. Mockito 문서에 언급 된 사례를보고 mock을 사용하여 mock을 반환하지 않습니다. 감사. –

1

실제로 클래스 경로 문제를 찾고 relaoding합니다. mockito 메일 링리스트와 이슈 트래커에서보고 된 문제점 중 일부는 잘못된 클래스 경로 (잘못된 버전의 jar 등) 및 클래스 재로드 (일부 jars는 다시로드되지만 mockito는 다시로드되지 않고 클래스를 인스턴스화 할 수 있음)까지 추적 될 수 있습니다. 잘못된 클래스 로더와 함께). 사용중인 버전과 도구의 이름처럼

@Aces 당신은

+0

ArrayList 및 HashMap 구현을 사용하여 mock을 대체했으며 답변에서 제안 된대로 업 캐스팅하여 해킹을 시도했습니다. 두 가지 솔루션 모두 정상적으로 작동했습니다. 따라서 프로젝트에 클래스 경로 문제가 있다고 생각하지 않습니다. 지금까지 모의 테스트 케이스를 실행할 수있었습니다. –

0

불행하게도이 아니다 (등, 어쩌면 프레임 워크, JRebel 플레이, 확실한 받는다는, 사양, ...), 더 자세한 정보를 제공 할 수 가능

케이스 : API에 대한 시험이 사용의

interface ConfigurationBuilder {...} 
configurationBuilder.newServerAction("s1").withName("111")....create(); 

주된 이유는 컴파일시에 호환성 유지 보수입니다. 예

Builder/*<ServerActionBuilder>-erasured generic*/ b = configurationBuilder.newServerAction("s1"); 
b.withName("111")...create(); 

결과는 위의 ServerAction해야하지만 mockito에서 생성 된 클래스의 객체는 다음과 같습니다 그러나 mockito 자바에서 삭제를 입력 할 예정 RETURNS_MOCKS 및 RETURNS_DEEP_STUBS 옵션 체인에 제네릭을 지원할 수 없습니다.

은 링크에서 지적 Issue: Can not Return deep stubs from generic method that returns generic type #484