¿Cómo escribir pruebas unitarias automatizadas para el procesador de anotación Java?

Estoy experimentando con procesadores de anotaciones de Java. Puedo escribir pruebas de integración usando el "JavaCompiler" (de hecho, estoy usando "Hickory" en este momento). Puedo ejecutar el proceso de compilación y analizar el resultado. El problema: una sola prueba se ejecuta durante aproximadamente medio segundo, incluso sin ningún código en mi procesador de anotaciones. Esto es demasiado largo para usarlo en estilo TDD.

Me burlo de las dependencias me parece muy difícil (tendría que burlarme del paquete completo "javax.lang.model.element"). ¿Alguien ha logrado escribir pruebas unitarias para un procesador de anotaciones (Java 6)? Si no ... ¿cuál sería su enfoque?

Respuesta 1

Esta es una vieja pregunta, pero parece que el estado de las pruebas del procesador de anotaciones no ha mejorado, por lo que lanzamos Compile Testing hoy. Los mejores documentos están en package-info.java , pero la idea general es que existe una API fluida para probar la salida de compilación cuando se ejecuta con un procesador de anotación. Por ejemplo,

ASSERT.about(javaSource())
    .that(JavaFileObjects.forResource("HelloWorld.java"))
    .processedWith(new MyAnnotationProcessor())
    .compilesWithoutError()
    .and().generatesSources(JavaFileObjects.forResource("GeneratedHelloWorld.java"));

prueba que el procesador genera un archivo que coincide GeneratedHelloWorld.java(archivo dorado en la ruta de clase). También puede probar que el procesador produce una salida de error:

JavaFileObject fileObject = JavaFileObjects.forResource("HelloWorld.java");
ASSERT.about(javaSource())
    .that(fileObject)
    .processedWith(new NoHelloWorld())
    .failsToCompile()
    .withErrorContaining("No types named HelloWorld!").in(fileObject).onLine(23).atColumn(5);

Obviamente, esto es mucho más simple que burlarse y, a diferencia de las pruebas de integración típicas, toda la salida se almacena en la memoria.

Respuesta: 2

He usado http://hg.netbeans.org/core-main/raw-file/default/openide.util.lookup/test/unit/src/org/openide/util/test/AnnotationProcessorTestUtils.java aunque esto está basado en java.io.Filela simplicidad y también lo ha hecho el rendimiento por encima se quejan de.

La sugerencia de Thomas de burlarse de todo el entorno JSR 269 conduciría a una prueba de unidad pura. En su lugar, es posible que desee escribir más de una prueba de integración que verifica cómo su procesador realmente se ejecuta dentro de javac, lo que le garantiza que es correcto, pero simplemente desea evitar los archivos de disco. Hacer esto requeriría que escribas un simulacro JavaFileManager, que desafortunadamente no es tan fácil como parece y no tengo ejemplos a mano, pero no deberías necesitar burlarte de otras cosas comoElement interfaces.

Respuesta: 3

Estaba en una situación similar, así que creé la biblioteca Avatar . No le dará el rendimiento de una prueba unitaria pura sin compilación, pero si se usa correctamente, no debería ver mucho impacto en el rendimiento.

Avatar le permite escribir un archivo fuente, anotarlo y convertirlo en elementos en una prueba unitaria. Esto le permite unir métodos de prueba y clases que consumen objetos Element, sin invocar manualmente javac.

Respuesta: 4

Estoy escribiendo un archivo STL que consiste en un encabezado de 80 bytes, un entero de 4 bytes, y luego registros de 50 bytes, cada uno compuesto por flotantes y un entero corto. Usando un RandomAccessFile puedo escribir fácilmente ...

las dos formas que sé para obtener la URL de la página son: 1.a través de la clase de applet: Applet.getDocumentBase () 2.a través de la biblioteca de JavaScript de netscape: JSObject.getWindow (this) .eval ("location.href") Primero, ...

En este bonito artículo sobre JMS, Bruce Snyder (Autor de "ActiveMQ en acción") menciona: [una] de las opciones para implementar un escucha de mensajes para usar con Spring DMLC es usar javax.jms ...

Me gustaría descubrir todas las implementaciones de una interfaz durante el tiempo de ejecución en una aplicación Java y cargar esas clases dinámicamente desde archivos JAR que el usuario puede agregar a una carpeta. Es un sistema enchufable, ...