2010-05-27 6 views
26

J'ai une méthode que j'essaie de tester unitaire. Cette méthode prend un paramètre comme ArrayList et fait des choses avec. La maquette que je suis en train de définir est:.mockito ArrayList <String> problème

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

qui donne un [sans contrôle] avertissement de conversion non contrôlée »

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

me donne une erreur

soins Toute personne me éclairiez à. ce que je fais mal?

Répondre

52

L'alternative est d'utiliser l'annotation @Mock depuis lors Mockito peut utiliser la réflexion de type pour trouver le type générique:

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

Merci. Solution intelligente C'est un peu injuste, ce n'est pas marqué comme ça. – pimpf0r

+0

Bonne réponse, j'ai fini par utiliser cette approche. –

+0

Ouais, pas regardé cette question depuis des lustres ... Désolé. – Sardathrion

23

ArrayList<String>.class est une construction non supportée par le compilateur Java

Pour vous essayez d'abord, vous devez faire ceci:

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

Cela se produit parce que la méthode mock ne peut retourner un type brut. En général, il n'est pas bon d'utiliser les types bruts car cela peut entraîner des erreurs d'exécution. Dans votre cas, c'est parfaitement bien, car vous savez que mocked n'est pas un vrai ArrayList<String> de toute façon.

Juste un conseil général sur @SuppressWarnings("unchecked") annotation. Essayez de le garder le plus près possible de la source du problème. Par exemple vous pouvez le mettre juste pour la déclaration de variable, ou vous pouvez le supprimer pour la méthode entière. En général, supprimez-le pour une variable, car sinon l'annotation de méthode large peut supprimer d'autres problèmes dans votre fonction.

+3

Comme une note de côté, ce problème est discuté comme point 24 (sur les pages 116- 118) de Java efficace, deuxième édition. L'intégralité du chapitre des génériques est disponible en format PDF sur le site de Sun: http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

Cela a du sens. En général, je n'aime pas ignorer les avertissements, mais je ne savais pas que vous pouviez ignorer une seule ligne. Merci. – Sardathrion

Questions connexes