function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
muromuromuromuro 

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があると、エラーは発生せず想定通りに処理が終了します。
  1. このような現象に遭遇した方はいらっしゃいますか。
  2. このような現象が発生する原因は何が考えられますか。
  3. System.debugなしで処理を正常に終了させるには、どうすればよいでしょうか。
以上3点、わかる方がいらっしゃいましたらよろしくお願いします。
Best Answer chosen by muromuro
T.AbeT.Abe
muromuro様

同じようなエラーに遭遇した者です。

下記サイトにエラーの原因が記載されています。
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

T.AbeT.Abe
muromuro様

同じようなエラーに遭遇した者です。

下記サイトにエラーの原因が記載されています。
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型に変更するという方法が提案されています。
もしまだ未解決のようでしたら、どうぞご検討ください。
This was selected as the best answer
muromuromuromuro
T.Abe様

こんな昔の投稿に返信いただきありがとうございました。
実はこの後、昨年2月頃にも似たような状態になり、そちらの案件は厳しいお客様だったため、最終的にSystem.debug()がある時とない時の挙動を確認してもらったうえで
「System.debug()があると動くがないと動かない、それ以外は正常に動作する」ことを確認いただいたうえで納品を行いました。

Summer'20で修正されるということは、やはりこの現象はバグだったということですね。
1年半越しの疑問がようやく解決しました。ありがとうございました。