Как мне протестировать пользовательскую задачу муравья? - PullRequest
6 голосов
/ 08 октября 2008

Я пишу пользовательскую задачу муравья, которая расширяет задачу. Я использую метод 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();

Когда код запускается как тест, он выдает исключение 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)

Кто-нибудь знает способ предоставить контекст или заглушки или что-то похожее на задачу?

Спасибо

Rob.

Принят ответ от Абаракса. Я был в состоянии вызвать task.setProject (новый проект ()); Теперь код выполняется нормально (за исключением того, что в консоли не отображается логирование - по крайней мере, я могу использовать код :-)).

Ответы [ 3 ]

8 голосов
/ 09 октября 2008

Или, что еще лучше, отсоедините сам объект задачи от логики (давайте назовем его TaskImpl) внутри задачи, чтобы вы могли передавать свои собственные зависимости (например, регистратор). Затем, вместо тестирования объекта задачи, вы проверяете TaskImpl ->, который вы можете передать в регистраторе, и любые другие странные фрагменты, которые могут понадобиться для его работы. Затем модульное тестирование - это вопрос насмешки зависимостей.

1 голос
/ 09 декабря 2009

Ant имеет удобный класс BuildFileTest, который расширяет класс JUnit TestCase. Вы можете использовать его для проверки поведения отдельных целей в файле сборки. Использование этого позаботится обо всем раздражающем контексте.

В главе "Задачи по написанию задач Apache Ant", описывающей это, есть глава Test The Task .

1 голос
/ 09 октября 2008

Глядя на исходный код 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);
    }
  }
}

Похоже, это может быть вашей проблемой. Ваша задача нуждается в контексте проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...