如何为 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 响应正确的地方。 希望这有帮助