如果我有一个名为authorize()
的Apex函数,该函数仅获取用户名,密码和会话令牌,另一个函数名为getURL('id#', 'key')
,则该函数将记录的id#作为字符串和图像的键。以字符串作为参数返回。 getURL调用其中的authorize函数,以获取其标注的凭据。授权是发布请求,而getURL是获取请求。
我试图弄清楚如何测试这两个标注,以便确保getURL返回正确的JSON作为响应。甚至不必是URL,这最终是其意图。但是我只需要对其进行测试,以确保这些标注可以正常工作,并且对于所需要的75%的代码覆盖率,我得到了答复。
我做了一个multiRequestMock类,看起来像这样:
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文件,但不确定如何使用此模拟类来测试我的原始功能。在这方面的任何澄清或帮助都会有所帮助,谢谢。
最佳答案
我相信在您的calloutTest
类中,您可以使用Test.setMock(HttpCalloutMock.class, new MultiRequestMock(mapOfRequests));
然后调用getUrl
和/或authorize
方法,而不是真正执行返回请求的请求,而是您在response(HttpRequest)
方法中指定的响应在MultiRequestMock
类中实现。基本上,这就是我所看到的工作方式,有关更多信息和示例,请参见this resource on testing callout classes。这将为您提供所需的代码覆盖率,但不幸的是无法检查您是否获得了正确的JSON响应。为此,您可能可以使用开发控制台和执行匿名?
您可能要考虑简化您的HttpCalloutMock
实现,并考虑从构造函数中删除映射,因为此类实际上只需要返回一个简单的响应,然后您的calloutTest
类就可以确保返回的响应正确。
希望这可以帮助