Testing HTTP Callouts — Overview

DEX455 - Apex 集成与工具完全指南:Callouts、命名凭据、WSDL2Apex、Mock 测试

📄 第 386 页 🎬 视频课程

课程章节介绍

同学们,今天我们来讲一个Apex开发中很重要的知识点——测试覆盖,特别是如何处理HTTP调用测试。 大家知道,我们在部署或打包Apex代码到生产环境之前,Salesforce要求至少75%的代码被测试覆盖。这意味着,你写的方法、逻辑,几乎都要有对应的测试代码跑一遍,保证它们没问题。 但是在写测试的时候,有个常见的坑:如果你用到了HTTP请求,比如调用外部API,默认的测试方法是不允许真正发出网络请求的。因为测试环境是隔离的,不能联网。如果你直接在测试里写HTTP callout,它会失败,甚至影响你的覆盖率。 怎么办呢?Salesforce给我们提供了 “模拟调用” 的方法,专业术语叫 “Mock”。就是用一个假的响应来代替真实的网络返回,让测试能顺利跑完。 你只需要在测试方法里调用一个关键方法:`Test.setMock`,告诉系统:“嘿,遇到HTTP请求时,别真去联网,用我给你的假数据就好”。 那么,这个假数据怎么提供呢?有两种简单的方式。 第一种,是实现一个叫 `HttpCalloutMock` 的接口。你单独写一个Apex类,在里面定义当收到某个请求时,返回什么响应。这种方式很灵活,可以自定义状态码、响应体、头部信息等等,适合需要精细控制的情况。 第二种,是用静态资源配合两个现成的类:`StaticResourceCalloutMock` 或 `MultiStaticResourceCalloutMock`。你事先在静态资源里上传一个文件,比如一个JSON或XML文件,然后在测试代码里说:“遇到HTTP callout,就用这个静态资源里的内容作为响应”。很简单,不用额外写太多代码。`MultiStaticResourceCalloutMock`则是可以根据不同的请求URL返回不同静态资源内容,一个测试里模拟多个接口。 最后记住一个重要的测试技巧:如果你需要在一段测试代码中间才开始启用callout的模拟,或者想精确控制模拟生效的时机,要用到 `Test.startTest()` 和 `Test.stopTest()` 这对方法。它们把测试代码分成两个阶段,只有在这之间的代码会受到getMock设置的影响。这样做能让你更精准地测试异步流程或复杂逻辑。 总结一下,保证高测试覆盖的同时,遇到HTTP callout不要慌,用 `Test.setMock` 模拟输出,要么写个Mock类,要么用静态资源,再配合 `startTest/stopTest`,你的测试就能安全、高效地通过了。 这就是今天的内容,大家消化一下,有问题随时问。

关键词

Apex Salesforce Developer Guide