2008-10-08 11 views
6

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.¿Cómo pruebo la unidad de una tarea personalizada?

Esta es la costumbre de tareas:

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 unidad:

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

Cuando el código se ejecuta como una prueba que da una NullPointerException cuando se llama 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,

Rob.

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 :-)).

Respuesta

1

Mirando el código fuente Ant Estas son las dos clases relevent: ProjectComponent y Task

que está llamando el método de registro de la tarea:

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

que se pide:

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

Como no tiene proyecto configurado, se llamará "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 su problema. Tu tarea necesita un contexto de proyecto.

8

O mejor aún, desacople el objeto de la tarea de la lógica (le llamaremos 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.

+1

¡Definitivamente haz esto! TDD es una metodología de diseño, cuando Ant proporciona el diseño, no puede hacer mucho, especialmente si hereda de una superclase proporcionada por el marco que no está bajo su control. Desea probar * solo * la funcionalidad que proporciona, * no * Implementación de tareas por parte de las hormigas. Votando! –

1

Ant tiene una práctica clase llamada BuildFileTest que amplía 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 Test The Task en el tutorial de tareas de escritura de Apache Ant que describe esto.

Cuestiones relacionadas