質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

Apex

Apexは、Salesforce上で動作するアプリケーション作成をサポートするアプリケーション開発プラットフォーム。プログラミング言語であるApexコードと、独自のApex WebサービスAPIなどで構成されています。

Q&A

解決済

1回答

7549閲覧

Apexのテストクラスでのエラー

nakamu_

総合スコア13

Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

Apex

Apexは、Salesforce上で動作するアプリケーション作成をサポートするアプリケーション開発プラットフォーム。プログラミング言語であるApexコードと、独自のApex WebサービスAPIなどで構成されています。

0グッド

0クリップ

投稿2017/06/21 01:19

編集2017/06/21 04:56

Apexのテストクラスで以下のエラーが出ます。

エラーメッセージ

System.AsyncException: Database.executeBatch cannot be called from a batch start, batch execute, or future method.

テストクラスでは以下のように呼び出しております。

execute.testexecuteBatch();

executeApex.testexecuteBatchの処理

nextCreate nC = new nextCreate(); Id batchId = Database.executeBatch(nC);

nCの中ではstart , execute , finishがあります。

テストクラスの中で直接、対象のクラスをDatabase.executeBatchに渡して実行すると上記エラーメッセージはでなくなります。

足りない情報などござましたら、質問いただけると幸いです。
どなたかわかる方教えて頂けますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テストクラスの中で直接、対象のクラスをDatabase.executeBatchに渡して実行がそもそも正解ではありませんか?

「Apex開発者ガイド」の「Apex の一括処理の使用」というページに、「Apex の一括処理のテスト」という記述がありますが、そこだと、Database.executeBatchをテストコードに書く例があります。


追記
コードとしては以下のようなイメージかと思います。

//バッチを呼び出すクラス public class testexecuteBatch{ //ボタン契機?スケジュール?か分からないけど、バッチを呼び出すメソッド public void kickBatch(){ nextCreate cls = new nextCreate(); Database.execute(cls); }
//バッチ処理のクラス public class nextCreate implements Database.Batchable<sObject> { global Database.querylocator start(Database.BatchableContext BC){ return Database.getQueryLocator('SELECT Id FROM Account'); } global void execute(Database.BatchableContext BC, List<sObject> scope){ //バッチの処理などなど } global void finish(Database.BatchableContext BC){ } }

このときのtestexecuteBatchのテストの書き方ですが、単純にテストしたいクラス・メソッドをstartTest,stopTestではさんであげればよいかと思います。

@isTest public class testexecuteBatch{ @isTest private void unitTest01(){ Test.startTest(); testexecuteBatch cls = new testexecuteBatch(); cls.kickBatch(); Test.stopTest(); } }

投稿2017/06/21 01:42

編集2017/06/21 05:57
nabeyaki

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamu_

2017/06/21 04:19

ご回答くださりありがとうございます。 Database.executeBatchを実行している クラスをテストクラスの中で呼び出すのは不可能なのでしょうか。 稚拙な質問となり申し訳ございません。 以上、宜しくお願い致します。
nabeyaki

2017/06/21 04:38 編集

状況を整理したいのですが、 ・nextCreateクラスがBatchableインターフェースを実装している。 ・「executeApex.testexecuteBatchの処理」のコードの記述については、コントローラorスケジューラのクラスで、バッチを実行するためのものである。 ・テストコードはバッチを実装しているクラス(おそらくnextCreateクラス)のメソッドを直接指定したい。 ということでよろしいですか?
nakamu_

2017/06/21 04:47

nabeyaki様 ご回答ありがとうございます。 記載していただいている通りで相違ございません。 わかりにくい質問となってしまい、 申し訳ないのですが宜しくお願い致します。
nabeyaki

2017/06/21 05:04

テストクラスで、start、execute、finishを直接指定はたしかNGだったと思います。 すなおに開発ガイドの書き方に従い、テストクラスにDatabase.executeBatchを書いたほうがよいかと思います。 また、カバレッジを上げるという観点だと、コントローラのバッチ呼び出しボタンやスケジューラのテストを行うと、同時にバッチも起動されカバレッジがあがるかと思います。
nakamu_

2017/06/21 05:34

nabeyaki様 >・テストコードはバッチを実装しているクラス(おそらくnextCreateクラス)のメソッドを直接指定した い。 >ということでよろしいですか? 申し訳ございません、説明が間違っておりました。 start , execute , finishを実装しているクラス(nextCreateクラス)を Database.executeBatchに渡し、Database.executeBatchを呼んでいるクラス(testexecuteBatch)を さらにテストクラスで呼び出したい形になりますが この場合も同様にNGでしょうか。
nabeyaki

2017/06/21 05:59

追記にコード例を書きました。 このようなテストコードで大丈夫だと思うのですが、どうでしょうか?
nakamu_

2017/06/21 06:02

nabeyaki様 わざわざコードまで起こしていただき 誠にありがとうございます、感謝感激です。 確認させていただきます。 取り急ぎのご返信です。
nakamu_

2017/06/21 06:17

nabeyaki様 コード確認させていただきました。 確認したところ現在実装している書き方と同じ書き方でした。。。 記載していただいたコードの構造で上記エラーが出てしまいます。 書いていただいたように素直にテストクラスの中でDatabase.executeBatch書いたほうがいいような気がしてきました。。。
nabeyaki

2017/06/21 06:56

うーん。一応、自身の過去作ったバッチ、テストコードなどを参考にしながらコード書いてみたのですが・・・。 テストコードもDatabase.executeBatch()を直書きせずにコード通したことあるので、できるはずなんですけど。。お力になれずすいませんでした。
nakamu_

2017/06/21 07:16

nabeyaki様 上記の書き方でコードが通った実績があるならDatabase.exeCuteBatch前後の処理の問題かも知れません。それがわかっただけでも良かったです。 >お力になれずすいませんでした。 とんでもございません、ご教示頂きありがとうございました。 こちらこそお時間を頂いてしまい申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問