2012-02-20 6 views
18

¿Es posible marcar dos anotaciones como mutuamente excluyentes?Anotaciones mutuamente excluyentes

Tengo un corredor JUnit personalizada y quiero para asegurarse de que si una prueba está marcado con mi anotación @Custom marcándolo con @Test arrojará (preferentemente) un error de compilación o (preferiblemente menos) un error de ejecución.

La razón por la que deseo esto es que @Custom es básicamente @Test pero con algún preprocesamiento adicional antes de ejecutar la prueba. Y, tal como lo he codificado, para cada etiqueta personalizada (sí, hay más de una), la prueba se ejecutará tantas veces con el preproceso correspondiente cada vez. Por lo tanto, que se ejecute para @Test tampoco tiene sentido ya que esa prueba debe tener algún preprocesamiento.

Y, sí, quiero admitir tanto @Custom como @Test en mi marco (aunque no para el mismo método de prueba).

+5

Bueno, puede implementarlo trivialmente como un error de tiempo de ejecución; durante el código que procesa su '@ Custom', simplemente verifique si hay una' @ Test' adicionalmente presente. No creo que esto sea posible en tiempo de compilación, sin el uso de procesadores de anotación; un área de dolor que probablemente no valga la pena. – FauxFaux

+2

Una herramienta de análisis estático como PMD puede ayudar aquí. –

+0

intente esto http://stackoverflow.com/questions/378616/can-i-generate-a-compile-time-error-based-on-the-type-of-the-field-being-annotat – Shahzeb

Respuesta

1

No hay ninguna manera de poner limitaciones a las anotaciones que puede poner en un elemento de Java. Entonces, por ejemplo, puede marcar un campo como @Required y @Optional, aunque esto sería completamente absurdo.

Tendría que hacer el control en tiempo de ejecución mirando qué anotaciones están presentes, o buscando el específico que le interesa, y luego lanzando una excepción (que sería capturada por una prueba unitaria).

Puede haber una mejor solución para su problema específico. Si desea tratar ciertos casos de prueba especialmente, puede implementar su propio corredor de prueba y usar la anotación @RunWith para invocarlo. Entonces, podría asegurarse de que sus métodos @Custom obtengan las acciones de requisito previo.

1

Puede utilizar el proceso de anotación Java para hacer esto por usted (llamando a una operación de compilación posterior que a su vez falla en la tarea de compilación), pero es innecesariamente complicado. (Si realmente quiere, dígame y desenterro ese código para usted). Más fácil sería tener una clase pequeña a la que llame manualmente que recopile la información.

lo tanto más preciso: ¿Usted lo necesita para ti (a ti mismo y sólo usted) como la conveniencia o lo necesita para su gran proyecto como una solución automatizada (y está dispuesto a poner un poco de esfuerzo en él?)

0

Dado que el código se está ejecutando en su marco de trabajo, puede agregar códigos AOP para verificar la relación mutuamente excluyente mediante la adición de puntoCort a todas las clases anotadas con @Custom y si también hay @Test anotado, ejecute RuntimeException.

Cuestiones relacionadas