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

编写Mock Callout类时,调用Queueable异步类execute方法的参数困惑

解决Queueable异步类execute方法的测试参数问题

Queueable接口的execute(QueueableContext sc)方法不能直接手动调用,因为QueueableContext是Salesforce运行时自动注入的系统对象,没有公开的构造方法,无法手动实例化传入。

针对你的测试场景,有两种可行的解决方案:

1. 通过系统API触发异步执行(完整测试流程)

在测试方法中使用System.enqueueJob()提交Queueable任务,配合Test.startTest()和Test.stopTest()强制同步执行异步逻辑,Salesforce会自动处理QueueableContext的传入:

@isTest
static void testNewDonorLetterQueueable() {
    // 设置Mock Callout,模拟API响应
    Test.setMock(HttpCalloutMock.class, new YourCustomMockCallout());

    Test.startTest();
    // 提交Queueable任务
    System.enqueueJob(new NewDonorLetter2());
    Test.stopTest(); // 此处会同步执行异步任务的execute方法

    // 在这里添加断言,验证API调用后的业务结果(比如数据是否正确更新)
}

2. 抽离核心业务逻辑(单独测试API调用)

如果只想测试API调用的逻辑,无需完整测试Queueable异步流程,可以把execute方法中的核心代码抽离成独立的公共方法,脱离对QueueableContext的依赖:

public class NewDonorLetter2 implements Queueable {
    public void execute(QueueableContext sc) {
        // 调用抽离的核心方法
        processDonorLetterAPI();
    }

    // 抽离的API处理方法,方便直接测试
    public HttpResponse processDonorLetterAPI() {
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        // 设置请求URL、方法、参数等逻辑
        req.setEndpoint('https://your-api-endpoint.com');
        req.setMethod('POST');
        // ...其他请求设置

        return http.send(req);
    }
}

测试时直接调用抽离的方法:

@isTest
static void testDonorLetterAPI() {
    Test.setMock(HttpCalloutMock.class, new YourCustomMockCallout());

    Test.startTest();
    NewDonorLetter2 instance = new NewDonorLetter2();
    HttpResponse res = instance.processDonorLetterAPI();
    Test.stopTest();

    // 验证API响应结果
    System.assertEquals(200, res.getStatusCode(), 'API调用失败');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:05:11