2012-05-03 27 views
3

私は、grailsアプリケーションでQuartzジョブの統合テストを書いています。 私はgrails-app/jobsフォルダにジョブを持っています。アプリケーションを起動すると動作します。問題は、統合テストで取得したいのですが、autowireは機能しません。テストは次のようになります。Grailsクォーツジョブ統合テスト - 自動ジョブではありません。

class MyJobTest{ 
    MyJob myJob 
    def setUp(){ 
     assert myJob != null 
    } 

    def testExecute(){ 
     //test logic 
    } 

} 

ですが、myJobがnullなので失敗します。

答えて

4

クォーツジョブは、テスト環境下にあるサービスのようにautowiredではありません。 Quartzジョブのドキュメントには、デフォルトではテスト環境下でスケジュール通りに実行されないことが明示的に記載されています。私はあなたのsetUpmyJob = new MyJob()をインスタンス化し、​​メソッドを呼び出してテストします。トリガーをテストしようとしているのであれば、triggers {}の内部にあるものを調べる方法を見つけたいかもしれません。コメントに反応して

EDIT:

それがうまくいくかもしれないので、私は、アプリケーションコンテキストの外にサービスを得たことがありません。あなたのクラスを想定し

は次のようなものになります:私はおそらく次のようにそれはテストするような方法あなたが本当にここをテストしたいと思っているもの

class MyJob { 
    def myServiceA 
    def myServiceB 

    def execute() { 
     if(myJobLogicToDetermineWhatToDo) { 
      myServiceA.doStuff(parameter) 
     } else { 
      myServiceB.doStuff(parameter) 
     } 

    }   
} 

myJobLogicToDetermineWhatToDoです。私はあなたが正しく動作していることを確認するために、あなたのサービスmyServiceAとmyServiceBに対する統合テストや単体テストを持っている(または簡単に書くことができる)と思います。私はあなたのジョブの論理/配線を適切なサービスにテストするための単体テストを書くでしょう。

@Test 
void routeOne() { 
    def job = new MyJob() 
    def myServiceA = new Object() 
    def expectedParameter = "Name" 
    def wasCalled = false 
    myServiceA.metaClass.doStuff = {someParameter -> 
     assert expectedParameter == someParameter 
     wasCalled = true 
    } 
    job.myServiceA = myServiceA 
    //Setup data to cause myServiceA to be invoked 

    job.execute() 

    assert wasCalled 
} 

次に、このプロセスを、自分のジョブから取得したすべてのルートについて繰り返します。このようにして、できるだけ小さな部分までテストを分離し、使用しているサービスではなく呼び出すオブジェクトのロジックをテストできます。私はそこのロジックがシステムの別の部分で使用されているので、サービスを使用していると仮定します。この仕事を通してサービスをテストしていて何らかの理由で仕事がなくなったら、サービスを直接呼び出すためにテストを書き直さなければなりません。私が提案した方法では、サービスを直接テストするテストと、それらのサービスコールを模擬テストするテストがあります。仕事がなくなると、それに関連するテストを単に削除するだけで、テストカバレッジを失うことはありません。それは私がそれをテストする方法です。

+0

多くの感謝!問題は、Quartzが実行中にいくつかのロジックを持ち、サービスのいくつかのメソッドを実行するということです。テストでは、Jobクラスをインスタンス化し、アプリケーションコンテキストからサービスを自分で注入する必要があります。 – rascio

+0

私は別の解決策を見つけました:grails quartzプラグインにコマンドがあります: grails install-quartz-config。 環境{ テスト{ 石英{ 自動起動が=偽 } } } 詳細:[Grailsのドキュメント](HTTP:/これはテスト用石英ものをロード可能とすることができるQuartzConfig.groovyファイルを作成します/grails-plugins.github.io/grails-quartz/guide/configuration.html) – Nazar

関連する問題