2010-05-27 14 views
26

Ich habe eine Methode, die ich versuche, Unit-Test. Diese Methode nimmt einen Parameter als ArrayList und erledigt damit Dinge. Die Mock ich zu definieren versuche ist.mockito ArrayList <String> Problem

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

, die eine [ungeprüft] ungeprüft Umwandlung“Warnung gibt

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

ist mir ein Fehler

irgendwen mich darüber aufzuklären,. was ich tue falsch?

Antwort

52

Die Alternative ist die @Mock Annotation zu verwenden, da dann Mockito Typ Reflexion verwendet den generischen Typen zu finden:

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

Danke. Schlaue Lösung. Es ist irgendwie unfair, dass es nicht so markiert ist. – pimpf0r

+0

Große Antwort, ich endete mit diesem Ansatz. –

+0

Yeah, habe diese Frage nicht lange angeschaut ... Entschuldigung. – Sardathrion

23

ArrayList<String>.class ein Konstrukt ist nicht von Java-Compiler unterstützt.

Für Sie zunächst versuchen, sollten Sie dies tun:

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

Dies geschieht, weil mock Methode nur eine rohe Art zurückgeben kann. Im Allgemeinen ist es nicht gut, die Raw-Typen zu verwenden, da dies zu Laufzeitfehlern führen kann. In Ihrem Fall ist es vollkommen in Ordnung, weil Sie wissen, dass sowieso kein REAL ArrayList<String> ist.

Nur ein allgemeiner Hinweis über @SuppressWarnings("unchecked") Annotation. Versuchen Sie, es so nah wie möglich an der Quelle des Problems zu halten. Zum Beispiel können Sie es nur für die Variablendeklaration eingeben, oder Sie können es für die gesamte Methode unterdrücken. Im Allgemeinen unterdrücken Sie es für eine Variable, da sonst die breite Methoden-Annotation andere Probleme in Ihrer Funktion unterdrücken kann.

+3

Als Randbemerkung, dieses besondere Problem wird als Punkt 24 (auf den Seiten diskutiert 116- 118) von Effektivem Java, Zweite Ausgabe. Das gesamte Generics-Kapitel ist als PDF auf Suns Website verfügbar: http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

Das macht Sinn. Im Allgemeinen mag ich es nicht, Warnungen zu ignorieren, aber ich wusste nicht, dass Sie nur eine Zeile ignorieren könnten. Vielen Dank. – Sardathrion

Verwandte Themen