web-dev-qa-db-fra.com

mockito ArrayList <String> problème

J'ai une méthode que j'essaie de tester par unité. Cette méthode prend un paramètre comme ArrayList et fait les choses avec. La maquette que j'essaie de définir est:

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

qui donne un avertissement de conversion [non vérifiée] non vérifiée ".

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

me donne une erreur.

Quelqu'un veut-il m'éclairer sur ce que je fais mal?

L'alternative est d'utiliser l'annotation @Mock puisque Mockito peut alors 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);
  }
}
56
Steve N

ArrayList<String>.class Est une construction non prise en charge par Java.

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

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

Cela se produit car la méthode mock ne peut renvoyer qu'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 très bien, car vous savez que mocked n'est pas un VRAI ArrayList<String> De toute façon.

Juste un conseil général sur l'annotation @SuppressWarnings( "unchecked" ). 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.

25