2010-05-27 18 views
26

Mam metodę, którą próbuję test jednostkowy. Ta metoda przyjmuje parametr jako ArrayList i robi z nim rzeczy. Mock próbuję zdefiniować to:.mockito ArrayList <String> problem

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

co daje [niezaznaczone] niezaznaczone konwersji”ostrzeżenie

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

daje mi błąd

Każdy starań, aby oświecił mnie co do. co robię źle?

Odpowiedz

52

Alternatywą jest użycie adnotacji @Mock odtąd Mockito można użyć typu refleksji, aby odnaleźć typ rodzajowy:

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

Dziękuję. Inteligentne rozwiązanie. To trochę niesprawiedliwe, że nie jest tak oznaczone. – pimpf0r

+0

Świetna odpowiedź, skończyło się na zastosowaniu tego podejścia. –

+0

Tak, nie spojrzałem na to pytanie od wieków ... Przepraszam. – Sardathrion

23

ArrayList<String>.class jest konstruktem nie jest obsługiwana przez kompilator Javy.

Na pierwszej próbie, należy to zrobić:

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

Dzieje się tak dlatego mock metoda może zwrócić tylko rodzaj surowca. Ogólnie nie jest dobrze używać typów surowych, ponieważ może to prowadzić do błędów w czasie wykonywania. W twoim przypadku wszystko jest w porządku, ponieważ wiesz, że mocked i tak nie jest PRAWDZIWYM ArrayList<String>.

Tylko ogólna porada dotycząca adnotacji @SuppressWarnings("unchecked"). Staraj się trzymać go jak najbliżej źródła problemu. Na przykład możesz umieścić ją tylko dla deklaracji zmiennej lub możesz ją pominąć dla całej metody. Zasadniczo, pomiń go dla zmiennej, ponieważ w przeciwnym razie opis metody szerokiej może tłumić inne problemy w twojej funkcji.

+3

Na marginesie, to szczególny problem został omówiony w punkcie 24 (na stronach 116- 118) Effective Java, wydanie drugie. Cały rozdział Generics jest dostępny w postaci pliku PDF na stronie firmy Sun: http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

To ma sens. Generalnie nie lubię ignorować ostrzeżeń, ale nie wiedziałem, że możesz zignorować tylko jedną linię. Dzięki. – Sardathrion

Powiązane problemy