我正在编写一个扩展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()); 代码现在执行正常(除了控制台中没有记录 - 至少我可以运用代码:-))。
答案 0 :(得分:8)
或者更好的是,将任务对象本身与任务中的逻辑(让我们称之为TaskImpl)分离 - 这样您就可以传入自己的依赖项(例如,记录器)。然后,测试TaskImpl - >而不是测试任务对象。您可以在记录器中传递它,以及它可能需要完成其工作的任何其他奇怪的部分。然后单元测试就是模拟依赖关系。
答案 1 :(得分:1)
查看Ant源代码,这些是两个相关的类:ProjectComponent和Task
您正在从任务中调用日志方法:
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);
}
}
}
看起来这可能是你的问题。您的任务需要项目上下文。
答案 2 :(得分:1)
Ant有一个名为BuildFileTest的方便类,它扩展了JUnit TestCase类。您可以使用它来测试构建文件中各个目标的行为。使用它可以处理所有令人讨厌的环境。
Apache Ant Writing Tasks Tutorial中有一个Test The Task章节描述了这一点。