Outils pour enregistrer / rejouer les appels de méthode Java
Notre application Java a un certain nombre de modules qui implémentent une interface commune. De par sa conception, chaque module est bien encapsulé et interchangeables. Tous les appels vers / depuis passent par un petit ensemble d'interfaces.
Nous devons instrumenter ce mécanisme pour ajouter,
- Enregistrer les appels de méthode et les résultats dans un format structuré
- Rejouez ces appels par rapport au module, lors du débogage d'un problème ou du test d'un correctif.
- (Agréable à avoir) Utiliser les interactions enregistrées comme un Résultat "attendu", comparez-les à "Réel" lors de l'exécution des tests JUnit.
- (probablement-devrait-avoir) Être entièrement thread-safe.
Existe-t-il des options recommandées pour cela?
Quelques options que j'ai regardées:
- Chronon - Ressemble à un concept différent. ' Aucun code de votre programme n'est exécuté lors de la lecture des enregistrements '
- Quelques articles académiques sur JSnoopy, SCARPE ; ceux-ci ne semblent pas être publics les projets?
- Écrire à la main, par exemple capturer les appels avec AspectJ - Devrait fonctionner mais je me demande s'il y a quelque chose de prêt à l'emploi.
1 answers
En supposant que vous soyez très strict sur l'adhésion à votre petit ensemble d'interfaces, vous pouvez utiliser des objets wrapper qui font ce qui suit:
- Implémenter l'interface
- Log/enregistrer les entrées
- Déléguer l'appel à l'objet sous-jacent
- Log / enregistrer le résultat
- Renvoie le résultat à l'appelant
Vous pouvez également modifier les méthodes d'usine pour renvoyer des objets encapsulés plutôt que les objets sous-jacents afin que l'utilisation de ces wrappers soit de façon assez transparente.
Notez que vous devrez faire très attention à la mutabilité des paramètres: idéalement, tous les paramètres seraient immuables mais sinon, vous devrez prendre des copies profondes (peut-être via la sérialisation).
Théoriquement, vous pouvez également utiliser les entrées enregistrées pour activer la lecture et/ou les tests.... mais je serais prudent d'attendre trop de cela car la lecture vous obligerait à capturer tout état pertinent (y compris l'état externe comme DB transaction, accès au système de fichiers, etc.) En général, cela est difficile à réaliser, bien que vous puissiez le faire fonctionner dans votre cas spécifique.