Comment la & # 8220; réflexion statique & # 8221; travailler en java? (ex. in mockito ou easymock)

StackOverflow https://stackoverflow.com/questions/626328

Question

Je suis un gars .NET - et je code principalement en C #.

Depuis la version 3.0, nous pouvons exploiter les expressions lambda et les arbres d'expression pour utiliser réflexion statique . Par exemple, il est possible d'implémenter GetMethodName dans l'extrait de code suivant pour renvoyer le nom de la méthode passée en paramètre:

string methodName = GetMethodName( o => o.DoSomething());
Console.WriteLine(methodName); // displays "DoSomething"

Maintenant, quand je regarde les échantillons Mockito (ou EasyMock) dans le monde Java, je vois:

LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");

Comment ça marche?

Comment fonctionne la méthode when ? Comment interprète-t-il mockedList.get (0) comme un appel à la méthode get avec 0 passé en paramètre et non en tant que valeur?

Était-ce utile?

La solution

Les bibliothèques moqueuses ne fonctionnent généralement pas avec les arbres d'expression. Ils construisent un type qui implémente l'interface appropriée et répond aux appels de méthodes en les enregistrant ou en les validant et en renvoyant les réponses préprogrammées. Cela se fait généralement avec un proxy (par exemple, RealProxy dans .NET, Proxy en Java) ou avec la génération de code dynamique.

Dans le cas de EasyMock, il utilise Proxy (pour les interfaces en tout cas), comme vous pouvez le voir dans le code source: regardez dans org.easymock.internal.JavaProxyFactory .

Autres conseils

Les bibliothèques fictives Java fonctionnent généralement comme suit:

Lorsque vous créez une maquette, un proxy réel est créé (que ce soit à partir d'une interface ou d'une sous-classe), l'instance est en "mode d'enregistrement". Cela signifie que tout appel ultérieur est enregistré (nom de la méthode, paramètres, retour attendu). Notez que le proxy en mode enregistrement ne fait en réalité que d’enregistrer les appels. Il n'y a pas de réflexion en soi impliquée. Pas de découverte de métadonnées, etc. Bien sûr, ces bibliothèques font quelques astuces (telles que le stockage des invocations dans une variable thread-locale pour gérer les méthodes qui renvoient void), mais l'idée reste la même.

Ensuite, lorsque le " mode de lecture " " est lancée, l’instance fictive vérifie simplement les attentes de la liste des invocations (méthode + paramètres et valeurs de retour).

Je n’ai jamais travaillé avec mockito ou easymock, mais je ne pense pas que l’appel fasse ce que vous pensez. Il n'interprète pas mockedList.get (0) de manière particulière. La méthode get est exécutée normalement sur l'objet mockedList et le résultat de celui-ci est transmis à lorsque .

mockedList.get (0) est la syntaxe d'un appel de méthode et le fait exactement. Ce que fait cette méthode n'est pas tout à fait clair. Le type d'exécution de mockedList sera une sous-classe de LinkedList renvoyé par la méthode mock , qui peut être implémenté chaque fois que le framework moqueur le juge utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top