Solución:
Esta necesidad se cubre en Prueba de llamadas de Apex usando HttpCalloutMock. Específicamente, vea el Prueba de múltiples llamadas HTTP sección. Este es el ejemplo que usan:
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);
}
}
No estoy seguro de por qué no anotan la clase como @IsTest
. Probablemente deberías.
Esta es quizás la forma más simple de un simulacro que se ocupa de múltiples solicitudes.
Se declara como una clase interna de la clase de prueba, por lo que la idea es que maneje todos los casos que maneja la clase de prueba externa. En el respond
método, puede mirar el punto final de la solicitud o el cuerpo de la solicitud y usar la lógica if / else para devolver la respuesta falsa adecuada. (También puede agregar afirmaciones para verificar los detalles del cuerpo de la solicitud).
@IsTest
private class CalloutTest {
private class Mock implements HttpCalloutMock {
public HTTPResponse respond(HTTPRequest req) {
if (req.getEndpoint().endsWith('abc')) {
HTTPResponse res = new HTTPResponse();
res.setBody('{}');
res.setStatusCode(200);
return res;
} else if (req.getEndpoint().endsWith('xyz')) {
...
} else {
System.assert(false, 'unexpected endpoint ' + req.getEndpoint());
return null;
}
}
}
@IsTest
static void abc() {
Test.setMock(HttpCalloutMock.class, new Mock());
...
}
@IsTest
static void xyz() {
Test.setMock(HttpCalloutMock.class, new Mock());
...
}
}