6

我正在编写一个扩展 Task 的自定义 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)

有人知道提供上下文或存根或类似于任务的东西的方法吗?

谢谢,

抢。

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

4

3 回答 3

8

或者更好的是,将任务对象本身与任务内部的逻辑(我们称之为TaskImpl)分离——这样您就可以传入您自己的依赖项(例如,记录器)。然后,不是测试任务对象,而是测试 TaskImpl -> 你可以在记录器中传递它,以及它可能需要完成它的工作的任何其他奇怪的点点滴滴。那么单元测试就是模拟依赖关系的问题。

于 2008-10-09T08:57:31.687 回答
1

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

您正在从 Task 调用 log 方法:

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)”

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);
    }
  }
}

看起来这可能是你的问题。您的任务需要一个项目上下文。

于 2008-10-09T03:15:14.297 回答
1

Ant 有一个方便的类,称为 BuildFileTest,它扩展了 JUnit TestCase 类。您可以使用它来测试构建文件中各个目标的行为。使用它可以处理所有烦人的上下文。

Apache Ant 编写任务教程中有一个测试任务章节描述了这一点。

于 2009-12-09T17:15:49.300 回答