2010-11-05 15 views
1

En utilisant AspectJ, comment remplacez-vous une annotation existante?AspectJ: Comment remplacer une annotation existante

Je le code suivant

declare @method : @Test * *(..) : @Test(timeout=10); 

qui génère l'erreur suivante sur chaque méthode d'essai:

... already has an annotation of type org.junit.Test, cannot add a second 
instance [Xlint:elementAlreadyAnnotated] 

Bien sûr, l'erreur est logique, mais quelle est la syntaxe pour dire « supprimer l'annotation @Test de toutes les méthodes qui l'ont, puis le remplacer par @Test(timeout=10) "

Répondre

4

Je suis le chef de projet AspectJ. Sous https://bugs.eclipse.org/bugs/show_bug.cgi?id=313026 nous cherchons comment utiliser l'annotation annoncez pour:

  • AUGMENTER annotations existantes (en ajoutant des valeurs à ceux qui sont déjà là)
  • les remplacer
  • définir la priorité (si votre déclarer remplacer ce qui est là ?)

Nous examinons également une forme de celui-ci qui supprime les annotations:

@remove_from_method déclare: int MyMethod() : @À supprimer;

Mais vous ne pouvez pas le faire encore ...

+0

Merci pour la mise à jour. J'ai connecté ajouté quelques votes sur le bug. J'aimerais cette fonctionnalité. Il semble que la création d'un work-around est un processus plutôt moche. – gMale

1

Je doute que vous pouvez le faire avec Aspe ctJ. Au moins, je ne pouvais pas trouver des informations pertinentes dans la version actuelle de AspectJ in Action.

Ce que vous pouvez faire est d'injecter votre propre annotation personnalisée à côté de l'annotation de test et d'écrire une classe JUnit personnalisée Runner (lié avec l'annotation @RunWith, que vous pouvez à nouveau injecter avec votre aspect) qui donne à votre priorité d'annotation personnalisée sur l'annotation @Test.

+0

drôle, c'est le même livre que j'ai ouvert sur mon bureau, en ce moment. lol. J'aime où tu vas avec ça. J'ai écrit quelques mixins, donc je suis plutôt à l'aise de faire des classes complètement différentes (comme étendre quelque chose d'autre). Un problème avec votre suggestion: mes classes de test utilisent déjà l'annotation @RunWith. Je me demande si cela pourrait fonctionner si je fais que tous les tests étendent une classe parent qui utilise un @RunWith personnalisé, comme vous l'avez mentionné – gMale

+0

L'approche de la classe parent fonctionnera ('@ RunWith' est marqué avec @ Inherited), mais si l'enfant Les classes contiennent l'annotation, l'annotation enfant l'emporte sur l'annotation parent. –