Mockito: se moquant d'un arraylist qui sera lu en boucle dans une boucle for
J'ai une méthode de test qui contient le fragment de code suivant:
private void buildChainCode(List<TracedPath> lines){
for(TracedPath path : lines){
/.../
}
}
Mon test unitaire code ressemble à ceci:
public class ChainCodeUnitTest extends TestCase {
private @Mock List<TracedPath> listOfPaths;
private @Mock TracedPath tracedPath;
protected void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
}
public void testGetCode() {
when(listOfPaths.get(anyInt())).thenReturn(tracedPath);
ChainCode cc = new ChainCode();
cc.getCode(listOfPaths);
/.../
}
}
Le problème, c'est que pendant l'exécution du test, le test de code ne pénètre jamais dans la boucle for. Ce que, lorsque les conditions dois-je préciser, de sorte que la boucle serait entré? Actuellement, j'ai spécifié when(listOfPaths.get(anyInt())).thenReturn(tracedPath)
, mais je suppose qu'il n'est jamais utilisé.
Vous devez vous connecter pour publier un commentaire.
Votre problème, c'est que lorsque vous utilisez une collection dans une boucle for-each, son
iterator()
méthode est appelée; et vous n'avez pas écrasé cette méthode.Au lieu de se moquer de la liste, je recommande fortement que vous venez de passer une liste réelle, où les éléments sont juste votre moqué
TracedPath
, autant de fois que vous le souhaitez. Quelque chose commeLa Java Pour Chaque boucle à l'intérieur de votre
buildChainCode
méthode n'est pas l'appel deget()
, comme vous l'avez déjà compris - c'est à l'aide de laiterator()
méthode définie dansCollection<E>
, quiList<E>
s'étend.Je vraiment ne recommanderais pas de se moquer de la liste. Il n'y a aucun avantage, sauf si vous devez absolument vérifier que la liste a été réitéré à travers, et même alors, il est préférable de faire valoir ou de vérifier les résultats de votre classe, le comportement de certains intrants.
Passer certaines de mise en œuvre de
List<E>
commeLinkedList<E>
avectracedPath
en elle.