You need to sign in to do that
Don't have an account?

Apexコードからのバッチ処理のテストについて
Apexコードからバッチ処理を呼んでいるテストコードを作成しています。
Apex処理自体はすぐ終了するのですが
バッチ処理は時間差が発生しているため、テストコードで結果を確認するタイミングでは
まだバッチ処理が終了していません。
やりたいことはバッチ処理まで終了した結果をApexのテストコードで確認をしたいと考えています。
ご存知の方いらっしゃいましたら
ご教授願います。
サンプルをご提供頂けたら助かります。
説明が言葉足らずな部分がございますが
よろしくお願いいたします。
ご説明いただきありがとうございます。
バッチ処理の起動についてですが、
画面上からボタン押下されたときにコントローラーが起動し、
そのコントローラー内でバッチを起動する作りになっております。
そのため、スケジューラーで起動せずに
コントローラーのテスト内でバッチ処理もテストをしたいといった内容でした。
<処理の流れ>
①画面でサンプルボタン押下
②SampleコントローラーのSampleHandlerメソッドを実行
③SampleHandlerメソッド内でバッチ処理起動(Database.executeBatch)
上記内容の処理についてテストコードを作成しています。
SampleコントローラーTestというクラスを作成しまして
SampleHandlerTestのメソッドのテストとして③の結果までを確認したいと考えています。
下記のようなテストコードを作成していますが、System.assertEqualsの段階で結果がfaultになっています。
やはりスケジューラーなどの設定が必要なのでしょうか。
All Answers
私もApexスケジューラを初めて実装している最中で、BlogやらApexマニュアルを参考に作ったものですが、こんなコードで即時実行できました。
テストコードについて詳しくは、このページで解説されています。
http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_scheduler.htm
サンプルコード:
Apexテスト内で、スケジューラの即時実行を行いたい場合には、Test.startTestメソッド、Test.stopTestメソッドを利用する必要があります。
リファレンスのTest Methodsを参照すると、startTest、stopTestの説明に下記のように記載されています。
All asynchronous calls made after the startTest method are collected by the system. When stopTest is executed, all asynchronous processes are run synchronously.
startTestとstopTestの間でスケジューリングしてあげれば、stopTestを実行した際に、スケジューリングした処理を実行してくれます。
s_takiiのサンプルコードについても、大元のサンプルに従って、startTestとstopTestの間で実行されたのではないかと思います。
#一番最後の"Verify the job has not run"とコメントの付いた行では、一度も実行されていないことを確認されていますし・・・。
そもそものforce_dev1さんのご質問が、Apexスケジューラに関するものかどうかわかりませんので、ご期待に添える内容になっていないかもしれませんが、ご容赦ください。
aki124さんご指摘の通り、startTestとstopTestの記述が必要です。(この辺は省略してました)
> #一番最後の"Verify the job has not run"とコメントの付いた行では、一度も実行されていないことを確認されていますし・・・。
ほとんど拾ってきたサンプルコードそのままで疎通確認程度のものでした・・・。
まだデプロイもしてない開発途中のコードを元に解答するのは危険ですね。
ご指摘ありがとうございました。
ご説明いただきありがとうございます。
バッチ処理の起動についてですが、
画面上からボタン押下されたときにコントローラーが起動し、
そのコントローラー内でバッチを起動する作りになっております。
そのため、スケジューラーで起動せずに
コントローラーのテスト内でバッチ処理もテストをしたいといった内容でした。
<処理の流れ>
①画面でサンプルボタン押下
②SampleコントローラーのSampleHandlerメソッドを実行
③SampleHandlerメソッド内でバッチ処理起動(Database.executeBatch)
上記内容の処理についてテストコードを作成しています。
SampleコントローラーTestというクラスを作成しまして
SampleHandlerTestのメソッドのテストとして③の結果までを確認したいと考えています。
下記のようなテストコードを作成していますが、System.assertEqualsの段階で結果がfaultになっています。
やはりスケジューラーなどの設定が必要なのでしょうか。
解決いたしました。
「Test.stopTest();」を記述している位置が悪かったため
バッチ処理の実行結果を取得できていませんでした。
ご回答ご説明をいただきまして
大変ありがとうございました。