如何为 Salesforce 进行 MultiMock Http 标注测试?
How to make a MultiMock Http Callout Test for Salesforce?
如果我有一个名为 authorize()
的 Apex 函数,它只获取用户名、密码和会话令牌,还有另一个名为 getURL('id#', 'key')
的函数,它采用 id# 作为记录一个字符串和一个用于图像的键,以 return 作为字符串作为参数。 getURL 调用其中的授权函数以获取其标注的凭据。 authorize是一个post请求,getURL是一个get请求。
我正在尝试弄清楚如何测试这两个标注,以便我可以确保 getURL 是 returning 正确的 JSON 作为响应。它甚至不必是 URL 但这最终是它的意图。但我只需要对其进行测试,以确保这些标注正常工作,并且我正在收到针对它所需的 75% 代码覆盖率的响应。
我做了一个 multiRequestMock class 看起来像这样:
public class MultiRequestMock implements HttpCalloutMock {
Map<String, HttpCalloutMock> requests;
public MultiRequestMock(Map<String, HttpCalloutMock> requests) {
this.requests = requests;
}
public HTTPResponse respond(HTTPRequest req) {
HttpCalloutMock mock = requests.get(req.getEndpoint());
if (mock != null) {
return mock.respond(req);
} else {
throw new MyCustomException('HTTP callout not supported for test methods');
}
}
public void addRequestMock(String url, HttpCalloutMock mock) {
requests.put(url, mock);
}
}
然后我开始编写一个 calloutTest.cls 文件,但不确定如何使用这个模拟 class 来测试我的原始功能。对此的任何澄清或帮助都会有所帮助。谢谢。
我相信你的 calloutTest
class 你使用 Test.setMock(HttpCalloutMock.class, new MultiRequestMock(mapOfRequests));
然后调用 getUrl
and/or authorize
方法而不是请求真正执行响应 returned 将是您在 MultiRequestMock
class 中实现的 response(HttpRequest)
方法中指定的响应。这基本上就是我认为它的工作方式,有关更多信息和示例,您可以查看 this resource on testing callout classes。这将为您提供所需的代码覆盖率,但遗憾的是无法检查您是否获得了正确的 JSON 响应。为此,您可以使用开发控制台和执行匿名?
您可能需要考虑简化您的 HttpCalloutMock
实施并考虑从构造函数中删除地图,因为这个 class 实际上只需要 return 一个简单的响应然后您的 calloutTest
class 可以是您确保 returned 响应正确的地方。
希望这有帮助
如果我有一个名为 authorize()
的 Apex 函数,它只获取用户名、密码和会话令牌,还有另一个名为 getURL('id#', 'key')
的函数,它采用 id# 作为记录一个字符串和一个用于图像的键,以 return 作为字符串作为参数。 getURL 调用其中的授权函数以获取其标注的凭据。 authorize是一个post请求,getURL是一个get请求。
我正在尝试弄清楚如何测试这两个标注,以便我可以确保 getURL 是 returning 正确的 JSON 作为响应。它甚至不必是 URL 但这最终是它的意图。但我只需要对其进行测试,以确保这些标注正常工作,并且我正在收到针对它所需的 75% 代码覆盖率的响应。
我做了一个 multiRequestMock class 看起来像这样:
public class MultiRequestMock implements HttpCalloutMock {
Map<String, HttpCalloutMock> requests;
public MultiRequestMock(Map<String, HttpCalloutMock> requests) {
this.requests = requests;
}
public HTTPResponse respond(HTTPRequest req) {
HttpCalloutMock mock = requests.get(req.getEndpoint());
if (mock != null) {
return mock.respond(req);
} else {
throw new MyCustomException('HTTP callout not supported for test methods');
}
}
public void addRequestMock(String url, HttpCalloutMock mock) {
requests.put(url, mock);
}
}
然后我开始编写一个 calloutTest.cls 文件,但不确定如何使用这个模拟 class 来测试我的原始功能。对此的任何澄清或帮助都会有所帮助。谢谢。
我相信你的 calloutTest
class 你使用 Test.setMock(HttpCalloutMock.class, new MultiRequestMock(mapOfRequests));
然后调用 getUrl
and/or authorize
方法而不是请求真正执行响应 returned 将是您在 MultiRequestMock
class 中实现的 response(HttpRequest)
方法中指定的响应。这基本上就是我认为它的工作方式,有关更多信息和示例,您可以查看 this resource on testing callout classes。这将为您提供所需的代码覆盖率,但遗憾的是无法检查您是否获得了正确的 JSON 响应。为此,您可以使用开发控制台和执行匿名?
您可能需要考虑简化您的 HttpCalloutMock
实施并考虑从构造函数中删除地图,因为这个 class 实际上只需要 return 一个简单的响应然后您的 calloutTest
class 可以是您确保 returned 响应正确的地方。
希望这有帮助