Je n'ai pas de chance pour que Mockito capture les valeurs des arguments de fonction! Je me moque d'un index de moteur de recherche et au lieu de créer un index, j'utilise simplement un hachage.
// Fake index for solr
Hashmap<Integer,Document> fakeIndex;
// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);
// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
Je ne peux pas utiliser d'arguments arbitraires car je teste les résultats des requêtes (c'est-à-dire quels documents elles renvoient). De même, je ne veux pas spécifier une valeur spécifique pour et avoir une ligne pour chaque document!
Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))
J'ai regardé la section des rappels sur la page Utilisation de Mockito . Malheureusement, ce n'est pas Java et je n'ai pas pu faire fonctionner ma propre interprétation de cela en Java.
EDIT (pour clarification): Comment obtenir Mockito pour capturer un argument X et le passer dans ma fonction? Je veux que la valeur exacte (ou ref) de X soit transmise à la fonction.
Je ne veux pas énumérer tous les cas, et l'argument arbitraire ne fonctionnera pas car je teste différents résultats pour différentes requêtes.
La page Mockito dit
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
Ce n'est pas java, et je ne sais pas comment traduire en java ou transmettre tout ce qui s'est passé dans une fonction.
la source
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
devrait configurer l'objet simulé pour vous. Que se passe-t-il lorsque vous appelezreader.document(666)
?Réponses:
Je n'ai jamais utilisé Mockito, mais je veux apprendre, alors voilà. Si quelqu'un de moins ignorant que moi répond, essayez d'abord sa réponse!
Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() { public Object answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); Object mock = invocation.getMock(); return document(fakeIndex((int)(Integer)args[0])); } });
la source
Découvrez ArgumentCaptors:
https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class); Mockito.when(reader.document(argument.capture())).thenAnswer( new Answer() { Object answer(InvocationOnMock invocation) { return document(argument.getValue()); } });
la source
ArgumentCaptor
s pour le stubbing. Il y a cependant un gros avertissement à ce sujet dans ce lien. Procéder avec prudence.Vous pouvez utiliser verify () en combinaison avec ArgumentCaptor pour assurer l'exécution du test et ArgumentCaptor pour évaluer les arguments:
La valeur de l'argument est évidemment accessible via l'argument.getValue () pour une manipulation / vérification supplémentaire ou tout ce que vous souhaitez faire.
la source
Avec Java 8, cela pourrait être quelque chose comme ceci:
Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
Je suppose que
document
c'est une carte.la source