how ejecutar desde consola compile classes ant junit

compile - ejecutar ant desde consola



¿Cómo pruebo la unidad de una tarea ant personalizada? (3)

Estoy escribiendo una tarea personalizada que amplía la Tarea. Estoy usando el método log () en la tarea. Lo que quiero hacer es usar una prueba unitaria mientras desarrollo la tarea, pero no sé cómo configurar un contexto para que la tarea se ejecute para inicializar la tarea como si se estuviera ejecutando en la hormiga.

Esta es la tarea personalizada:

public class CopyAndSetPropertiesForFiles extends Task { public void execute() throws BuildException { log("CopyAndSetPropertiesForFiles begin execute()"); log("CopyAndSetPropertiesForFiles end execute()"); } }

Este es el código de prueba de la unidad:

CopyAndSetPropertiesForFiles task = new CopyAndSetPropertiesForFiles(); task.execute();

Cuando el código se ejecuta como una prueba, da una NullPointerException cuando llama al registro.

java.lang.NullPointerException at org.apache.tools.ant.Task.log(Task.java:346) at org.apache.tools.ant.Task.log(Task.java:334) at uk.co.tbp.ant.custom.CopyAndSetPropertiesForFiles.execute(CopyAndSetPropertiesForFiles.java:40) at uk.co.tbp.ant.custom.test.TestCopyAndSetPropertiesForFiles.testCopyAndSetPropertiesForFiles(TestCopyAndSetPropertiesForFiles.java:22)

¿Alguien sabe una manera de proporcionar un contexto o talones o algo similar a la tarea?

Gracias,

Robar.

Respuesta aceptada de Abarax. Pude llamar a task.setProject (new Project ()); El código ahora se ejecuta OK (excepto que no aparece el registro en la consola - al menos puedo ejercitar el código :-)).


En cuanto al código fuente de Ant, estas son las dos clases relevantes: ProjectComponent y Task

Está llamando al método de registro desde Tarea:

public void log(String msg) { log(msg, Project.MSG_INFO); }

Que llama:

public void log(String msg, int msgLevel) { if (getProject() != null) { getProject().log(this, msg, msgLevel); } else { super.log(msg, msgLevel); } }

Como no tiene un conjunto de proyectos, llamará a "super.log (msg, msgLevel)"

public void log(String msg, int msgLevel) { if (getProject() != null) { getProject().log(msg, msgLevel); } else { // ''reasonable'' default, if the component is used without // a Project ( for example as a standalone Bean ). // Most ant components can be used this way. if (msgLevel <= Project.MSG_INFO) { System.err.println(msg); } } }

Parece que este puede ser tu problema. Tu tarea necesita un contexto de proyecto.


O mejor aún, desacople el objeto de tarea de la lógica (vamos a llamarlo TaskImpl) dentro de la tarea, para que pueda pasar sus propias dependencias (por ejemplo, el registrador). Luego, en lugar de probar el objeto de la tarea, prueba TaskImpl -> que puede pasar en el registrador, y cualquier otra pieza extraña que pueda necesitar para hacer su trabajo. Entonces la prueba unitaria es una cuestión de burlarse de las dependencias.


Ant tiene una práctica clase llamada BuildFileTest que extiende la clase JUnit TestCase. Puede usarlo para probar el comportamiento de objetivos individuales en un archivo de compilación. Usar esto podría encargarse de todo el contexto molesto.

Hay un capítulo Probar la tarea en el tutorial de tareas de escritura de Apache Ant que describe esto.