2010-05-27 2 views
26

단위 테스트를 시도하는 방법이 있습니다. 이 메소드는 매개 변수를 ArrayList로 취하고이를 통해 작업을 수행합니다. 내가 정의하려고 모의은 다음과 같습니다. A [선택 해제]되지 않은 전환 "경고를 제공mockito ArrayList <String> 문제

ArrayList<String> mocked = mock(ArrayList.class); 

ArrayList<String> mocked = mock(ArrayList<String>.class); 

이 나에게 오류를 제공

누구나 치료가 나를 계몽. 내가 뭘 잘못하고있는거야?

답변

52

대안은 다음 Mockito는 제네릭 형식 찾을 형 반사를 사용할 수 있기 때문에 @Mock 주석을 사용하는 것입니다 : 보조 노트로

public class MyTest { 

    @Mock 
    private ArrayList<String> mockArrayList; 

    ... 

    public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    } 

    public void testMyTest() { 
    when(mockArrayList.get(0)).thenReturn("Hello world"); 

    String result = mockArrayList.get(0); 

    assertEquals("Should have the correct string", "Hello world", result); 

    verify(mockArrayList).get(0); 
    } 
} 
+1

감사합니다. 스마트 솔루션. 그것은 다소 불공평합니다. 그것은 그것으로 표시되지 않습니다. – pimpf0r

+0

위대한 답변, 나는이 접근법을 사용하는 것을 끝내었다. –

+0

그래, 나이에 그 질문을 보지 않았다. .. 미안. – Sardathrion

23

ArrayList<String>.class은 자바 컴파일러에서 지원하지 않는 구조체이다.

처음 시도를 위해

, 당신은이 작업을 수행해야합니다 mock 방법은 원시 형식을 반환 할 수 있기 때문에

@SuppressWarnings("unchecked") 
ArrayList<String> mocked = mock(ArrayList.class); 

발생합니다. 일반적으로 원시 형식을 사용하면 런타임 오류가 발생할 수 있으므로 좋지 않습니다. 어쨌든 mocked은 실제 ArrayList<String>이 아니므로 귀하의 경우에는 완벽합니다.

주석에 대한 일반적인 설명은 @SuppressWarnings("unchecked")입니다. 가능한 한 문제의 근원과 가깝게 유지하십시오. 예를 들어, 변수 선언에 넣을 수도 있고, 전체 메소드에 대해 그것을 억제 할 수도 있습니다. 그렇지 않으면 넓은 메소드 주석이 함수의 다른 문제를 억제 할 수 있기 때문에 일반적으로 변수에 대해이를 억제하십시오.

+3

을,이 특별한 문제는 페이지 (항목 24로 설명 116- 118) Effective Java, Second Edition. 전체 Generics 장은 Sun의 사이트에서 PDF로 제공됩니다. http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

의미가 있습니다. 일반적으로 나는 경고 무시를 싫어하지만 나는 한 줄만 무시할 수 있다는 것을 몰랐다. 감사. – Sardathrion