You need to sign in to do that
Don't have an account?
muromuro
System.debug()の有無でテストクラスの実行結果が変化する
いつもお世話になっております。
トリガのハンドラークラス内で、処理1から処理2に渡す過程に以下のコードがあります。
この時、上書きされた古いレコードはupdateListに、Trigger.newのレコードはdeleteListに格納しています。
その後、上のコードの処理で以下のレコードをreturnListに格納させます。
・updateListの全レコード
・sObjList(中身はTrigger.new)のうち、deleteListに格納されていないレコードすべて
returnListに格納後、updateListとdeleteListはそれぞれ更新・削除を行い、returnListを処理2へと渡します。
この時、上のコードでは14行目にあるSystem.debugを削除してしまうと、deleteListの中身がreturnListにも格納されてしまい、処理2でENTITY IS DELETEDがスローされてしまいます。
しかし、このSystem.debugがあると、エラーは発生せず想定通りに処理が終了します。
トリガのハンドラークラス内で、処理1から処理2に渡す過程に以下のコードがあります。
List<Id> deletedIdList = new List<Id>(); if(deleteList.size() > 0){ for(sObject deleteRecord: deleteList){ deletedIdList.add((Id)deleteRecord.get('Id')); } } returnList.addAll(updateList); for(sObject sObj: sObjList){ for(sObject updated: updateList){ if(updated.Id == sObj.Id){ break; } } System.debug(deletedIdList); if(deletedIdList.size() == 0 || !deletedIdList.contains((Id)sObj.get('Id'))){ returnList.add(sObj); } }処理1では、カスタムオブジェクトAのレコードの中に、特定の項目の値がTrigger.newのレコードと一致するレコードがある場合、一部の項目をその古いレコードに上書きし、Trigger.newのレコード自体は後で削除する、という処理を行っています。
この時、上書きされた古いレコードはupdateListに、Trigger.newのレコードはdeleteListに格納しています。
その後、上のコードの処理で以下のレコードをreturnListに格納させます。
・updateListの全レコード
・sObjList(中身はTrigger.new)のうち、deleteListに格納されていないレコードすべて
returnListに格納後、updateListとdeleteListはそれぞれ更新・削除を行い、returnListを処理2へと渡します。
この時、上のコードでは14行目にあるSystem.debugを削除してしまうと、deleteListの中身がreturnListにも格納されてしまい、処理2でENTITY IS DELETEDがスローされてしまいます。
しかし、このSystem.debugがあると、エラーは発生せず想定通りに処理が終了します。
- このような現象に遭遇した方はいらっしゃいますか。
- このような現象が発生する原因は何が考えられますか。
- System.debugなしで処理を正常に終了させるには、どうすればよいでしょうか。
同じようなエラーに遭遇した者です。
下記サイトにエラーの原因が記載されています。
https://success.salesforce.com/issues_view?id=a1p3A000001RXPlQAO&title=list-contains-fails-to-detect-element-match-when-input-param-is-an-sobject-id-field-it-succeeds-when-debug-logs-are-enabled
簡潔に申しあげますと、
List型の変数に対してcontainsメソッドを実行すると、
そのListがsObjectのIDを格納している場合は
一致する値が入っていてもfalseを返すようです。
しかし、containsの実行前にそのList変数をSystem.debugで呼び出している場合、
上記のようなエラーは起こらないようです。
解決策としまして、
List型をSet型に変更するという方法が提案されています。
もしまだ未解決のようでしたら、どうぞご検討ください。
All Answers
同じようなエラーに遭遇した者です。
下記サイトにエラーの原因が記載されています。
https://success.salesforce.com/issues_view?id=a1p3A000001RXPlQAO&title=list-contains-fails-to-detect-element-match-when-input-param-is-an-sobject-id-field-it-succeeds-when-debug-logs-are-enabled
簡潔に申しあげますと、
List型の変数に対してcontainsメソッドを実行すると、
そのListがsObjectのIDを格納している場合は
一致する値が入っていてもfalseを返すようです。
しかし、containsの実行前にそのList変数をSystem.debugで呼び出している場合、
上記のようなエラーは起こらないようです。
解決策としまして、
List型をSet型に変更するという方法が提案されています。
もしまだ未解決のようでしたら、どうぞご検討ください。
こんな昔の投稿に返信いただきありがとうございました。
実はこの後、昨年2月頃にも似たような状態になり、そちらの案件は厳しいお客様だったため、最終的にSystem.debug()がある時とない時の挙動を確認してもらったうえで
「System.debug()があると動くがないと動かない、それ以外は正常に動作する」ことを確認いただいたうえで納品を行いました。
Summer'20で修正されるということは、やはりこの現象はバグだったということですね。
1年半越しの疑問がようやく解決しました。ありがとうございました。