You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apex测试报错:DML operation Delete not allowed on List 求解决

解决Apex测试中删除AsyncApexJob的DML错误

首先,你碰到的DML operation Delete not allowed on List错误,核心原因是AsyncApexJob是Salesforce受保护的系统对象,平台完全禁止对它执行Delete DML操作——不管是生产环境还是测试环境都不行,所以你尝试删除查询到的AsyncApexJob列表的代码根本无法通过编译。

那怎么实现你要的“验证测试类执行后入队的作业数量”需求呢?其实根本不需要删除AsyncApexJob,因为Salesforce的测试方法运行在完全隔离的环境中,每次测试方法启动时,测试数据都是全新的,不会有其他测试遗留的AsyncApexJob干扰你的验证。你只需要调整测试逻辑,确保异步作业被强制执行后再查询验证:

修正后的测试代码示例

// 1. 执行触发异步作业的业务代码
YourTriggerOrClass.runYourAsyncLogic();

// 2. 强制所有异步作业立即执行(关键步骤!)
Test.stopTest();

// 3. 查询并验证异步作业数量
List<AsyncApexJob> asyncJobList = [SELECT Id FROM AsyncApexJob];
System.assertEquals(2, asyncJobList.size(), 'Two jobs should have been enqueued');

为什么这个方法有效?

  • Test.stopTest()是Apex测试中专门处理异步操作的核心方法:在它之前的代码会同步执行,所有被入队的异步作业(比如Queueable、Batch、Scheduled Job)都会在调用Test.stopTest()时被强制立即执行,这样你后续查询AsyncApexJob就能准确获取到当前测试生成的作业。
  • 测试环境的隔离性保证了每次测试方法运行时,AsyncApexJob列表初始为空,所以你查询到的结果就是当前测试生成的作业,完全不需要提前删除。

如果你的测试场景确实需要在同一个方法中多次触发异步操作,也不能用Delete DML清理,而是应该把不同的异步触发逻辑拆分成独立的测试方法,利用测试环境的隔离性来避免数据干扰。

内容的提问来源于stack exchange,提问作者David North

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:59