4

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

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

    def testExecute(){
         //test logic
    }

}

しかし、myJob が null であるため失敗します。

4

1 に答える 1

4

サービスがテスト環境下にあるように、Quartz ジョブは自動配線されません。Quartz ジョブのドキュメントには、デフォルトではテスト環境でスケジュールどおりに実行されないことも明示されています (必要に応じて変更できますが、私は変更しません)。myJob = new MyJob()あなたの中でインスタンス化しsetUp、メソッドを呼び出しexecute()てテストします。triggers {}トリガーをテストしようとしている場合は、metaClassを調べて内部にあるものを調べる方法を見つけたいと思うかもしれません。

コメントに応じて編集:

アプリケーションコンテキストからサービスを取得したことがないので、うまくいくかもしれません。私がおそらくそれをテストする方法は次のとおりです。

クラスが次のようになっていると仮定します。

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
}

次に、ジョブを通過するすべてのルートに対してこのプロセスを繰り返します。このようにして、テストを可能な限り最小の部分に分離し、使用しているサービスではなく、呼び出しているオブジェクトのロジックをテストできます。そこのロジックがシステムの別の部分で使用されているため、サービスを使用していると思います。このジョブでサービスをテストしていて、何らかの理由でジョブがなくなった場合は、テストを書き直してサービスを直接呼び出す必要があります。私が提案した方法では、サービスを直接テストするテストと、それらのサービス呼び出しをモックするテストがあります。ジョブがなくなった場合は、それに関連付けられているテストを削除するだけで、テスト カバレッジが失われることはありません。ちょっと長くなりましたが、それが私がそれをテストする方法です。

于 2012-05-03T15:11:36.417 に答える