salesforce apex测试类如果有多个httpmock,则只会返回一个,导致可能不符合预期

ops/2025/1/24 15:01:28/

在 Salesforce Apex 的测试类中,当需要模拟多个不同的 HTTP 响应时,可以使用 HttpCalloutMock 接口并实现逻辑来区分不同的 HTTP 请求并返回不同的响应。

如果多个 HTTP 请求都使用同一个 HttpCalloutMock 实例,而没有区分逻辑,则只会返回一个默认的响应,这可能会导致测试结果不符合预期。

解决方法:自定义 Mock 逻辑

通过实现自定义的 HttpCalloutMock,根据请求的 URL 或其他信息区分不同的 HTTP 请求,返回相应的响应。

以下是一个示例代码:

@isTest
public class MultiHttpMockTest {// 自定义 HttpMock 类public class CustomHttpCalloutMock implements HttpCalloutMock {public HTTPResponse respond(HTTPRequest req) {HttpResponse res = new HttpResponse();// 根据请求的 URL 或 Body 区分不同的响应if (req.getEndpoint().contains('https://example.com/api1')) {res.setStatusCode(200);res.setBody('{"result": "Response for API 1"}');} else if (req.getEndpoint().contains('https://example.com/api2')) {res.setStatusCode(200);res.setBody('{"result": "Response for API 2"}');} else {res.setStatusCode(404);res.setBody('{"error": "Not Found"}');}return res;}}@isTeststatic void testMultipleCallouts() {// 设置自定义 HttpMockTest.setMock(HttpCalloutMock.class, new CustomHttpCalloutMock());// 模拟第一个 API 调用HttpRequest req1 = new HttpRequest();req1.setEndpoint('https://example.com/api1');req1.setMethod('GET');HttpResponse res1 = new Http().send(req1);System.assertEquals(200, res1.getStatusCode());System.assert(res1.getBody().contains('Response for API 1'));// 模拟第二个 API 调用HttpRequest req2 = new HttpRequest();req2.setEndpoint('https://example.com/api2');req2.setMethod('GET');HttpResponse res2 = new Http().send(req2);System.assertEquals(200, res2.getStatusCode());System.assert(res2.getBody().contains('Response for API 2'));}
}

核心思路

  1. 自定义 HttpCalloutMock:实现 HttpCalloutMock 接口,在 respond 方法中根据请求的内容返回不同的响应。
  2. 使用区分条件:通过 req.getEndpoint()req.getBody() 或其他属性区分请求。
  3. 设置 Mock:使用 Test.setMock() 方法设置自定义的 HttpCalloutMock
  4. 在测试中验证:通过 HttpResponse 验证每次 HTTP 调用返回的内容是否符合预期。

注意事项

  • 确保请求的区分逻辑准确:避免因为相似的条件导致错误的响应。
  • 覆盖所有测试场景:为每种可能的请求配置对应的响应,确保测试的完整性。
  • 验证 HTTP 响应内容:不仅要验证状态码,还要验证响应的主体是否符合预期。

这种方式可以确保在测试类中正确模拟多个 HTTP 请求和响应。


http://www.ppmy.cn/ops/152764.html

相关文章

网络知识小科普--5

81、什么是组播路由? 组播路由是一种有针对性的广播形式,将消息发送到所选择的用户组,而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…

ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档

一、云电脑:电竞新宠崛起 在电竞游戏不断发展的今天,硬件性能成为了决定游戏体验的关键因素。为了追求极致的游戏画面与流畅度,玩家们往往需要投入大量资金购置高性能电脑。然而,云电脑技术的出现,为玩家们提供了一种…

微服务学习-Gateway 统一微服务入口

1. 微服务为什么需要 API 网关? 1.1. 在微服务架构中,通常一个系统会被拆分为多个微服务,面对多个微服务客户端应该如何去调用呢? 如果根据每个微服务的地址发起调用,存在如下问题: 客户端多次请求不同的…

HTML5 Web Worker 的使用与实践

引言 在现代 Web 开发中,用户体验是至关重要的。如果页面在执行复杂计算或处理大量数据时变得卡顿或无响应,用户很可能会流失。HTML5 引入了 Web Worker,它允许我们在后台运行 JavaScript 代码,从而避免阻塞主线程,保…

sed — 流编辑器:从入门到精通

内容速览 简介 sed(Stream Editor)是一个功能强大的文本处理工具,广泛应用于文本文件的自动化编辑和批量处理。它通过逐行读取文件内容并在内存中的临时缓冲区(即“模式空间”)中处理文本,实现高效的文本…

从手动到智能:自动化三维激光扫描

三维扫描,是通过先进三维扫描技术获取产品和物体的形面三维数据,建立实物的三维图档,满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 传统的…

JDK的下载

JDK(Java Development Kit)是Java开发工具包的缩写,它是Java开发的核心组件。 一、JDK的组成 JDK包含了多个关键部分,以满足Java程序开发的需求: Java编译器(javac):用于将Java源代…

2. Flink分区策略

一. Flink分区策略概述 Flink任务在执行过程中,一个流(stream)包含一个或多个分区(Stream partition),TaskManager中的一个slot的SubTask就是一个stream partition(流分区)。 Flink分区之间进行数据传递模式有两种。 1. one-to-one模式 数据不需要重新…