Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对自定义ant任务进行单元测试?_Ant_Junit - Fatal编程技术网

如何对自定义ant任务进行单元测试?

如何对自定义ant任务进行单元测试?,ant,junit,Ant,Junit,我正在编写一个自定义ant任务,它扩展了任务。我在任务中使用log()方法。我想做的是在开发任务时使用单元测试,但我不知道如何设置要运行的任务的上下文来初始化任务,就像它在ant中运行一样 这是自定义任务: public class CopyAndSetPropertiesForFiles extends Task { public void execute() throws BuildException { log("CopyAndSetPropertiesForFil

我正在编写一个自定义ant任务,它扩展了任务。我在任务中使用log()方法。我想做的是在开发任务时使用单元测试,但我不知道如何设置要运行的任务的上下文来初始化任务,就像它在ant中运行一样

这是自定义任务:

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

        log("CopyAndSetPropertiesForFiles end execute()");
    }
}
这是单元测试代码:

CopyAndSetPropertiesForFiles task = new CopyAndSetPropertiesForFiles();
task.execute();
当代码作为测试运行时,它在调用log时给出一个NullPointerException

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)
有人知道提供上下文、存根或类似任务的方法吗

谢谢

罗布

接受阿巴拉克斯的回答。我能够调用task.setProject(newproject());
代码现在执行正常(除了控制台中没有出现日志记录-至少我可以练习代码:-)。

查看Ant源代码,这是两个相关的类:和

您正在从任务调用日志方法:

public void log(String msg) {
     log(msg, Project.MSG_INFO);
}
这要求:

public void log(String msg, int msgLevel) {
  if (getProject() != null) {
    getProject().log(this, msg, msgLevel);
  } else {
    super.log(msg, msgLevel);
  }
}
由于您没有设置项目,它将调用“super.log(msg,msgLevel)”

公共作废日志(字符串msg,int msgLevel){
如果(getProject()!=null){
getProject().log(msg,msgLevel);
}否则{
//“合理”默认值,如果使用的组件没有
//项目(例如作为独立Bean)。
//大多数ant组件都可以这样使用。

如果(msgLevel或更好,则将任务对象本身与任务内部的逻辑(我们称之为taskinpl)分离,以便您可以传递自己的依赖项(例如,记录器)然后,您不需要测试任务对象,而是测试TaskImpl->,您可以将其传递到记录器,以及它可能需要执行其工作的任何其他奇怪的位和块。然后,单元测试就是模拟依赖项的问题。

Ant有一个名为BuildFileTest的简便类,它扩展了JUnit TestCase类。您可以使用它来测试行为生成文件中的单个目标。使用此选项将处理所有恼人的上下文


Apache Ant编写任务教程中有一章对此进行了描述。

一定要这样做!TDD是一种设计方法,当Ant提供设计时,你不能做太多——特别是如果你继承了框架提供的超类,而不是你控制的超类。你只想测试你提供的功能,而不是Ants实现当然,投票!
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);
    }
  }
}