クォーツジョブは、テスト環境下にあるサービスのようにautowiredではありません。 Quartzジョブのドキュメントには、デフォルトではテスト環境下でスケジュール通りに実行されないことが明示的に記載されています。私はあなたのsetUp
にmyJob = 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
}
次に、このプロセスを、自分のジョブから取得したすべてのルートについて繰り返します。このようにして、できるだけ小さな部分までテストを分離し、使用しているサービスではなく呼び出すオブジェクトのロジックをテストできます。私はそこのロジックがシステムの別の部分で使用されているので、サービスを使用していると仮定します。この仕事を通してサービスをテストしていて何らかの理由で仕事がなくなったら、サービスを直接呼び出すためにテストを書き直さなければなりません。私が提案した方法では、サービスを直接テストするテストと、それらのサービスコールを模擬テストするテストがあります。仕事がなくなると、それに関連するテストを単に削除するだけで、テストカバレッジを失うことはありません。それは私がそれをテストする方法です。
多くの感謝!問題は、Quartzが実行中にいくつかのロジックを持ち、サービスのいくつかのメソッドを実行するということです。テストでは、Jobクラスをインスタンス化し、アプリケーションコンテキストからサービスを自分で注入する必要があります。 – rascio
私は別の解決策を見つけました:grails quartzプラグインにコマンドがあります: grails install-quartz-config。 環境{ テスト{ 石英{ 自動起動が=偽 } } } 詳細:[Grailsのドキュメント](HTTP:/これはテスト用石英ものをロード可能とすることができるQuartzConfig.groovyファイルを作成します/grails-plugins.github.io/grails-quartz/guide/configuration.html) – Nazar