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

コードがテストとして実行されると、ログを呼び出すときに 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 には、JUnit TestCase クラスを拡張する BuildFileTest という便利なクラスがあります。これを使用して、ビルド ファイル内の個々のターゲットの動作をテストできます。これを使用すると、面倒なコンテキストがすべて処理されます。

これについて説明している Apache Ant Writing Tasks TutorialのTest The Task の章があります。

于 2009-12-09T17:15:49.300 に答える
1

Ant のソース コードを見ると、 ProjectComponentTaskの 2 つの関連クラスがあります。

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 に答える