Apex Academy
Módulo 10·06·30 min

Mocks para callouts

Un test no puede llamar a un sistema externo: fallaría. Para probar el código que lo hace, le das una respuesta de mentira, un mock, y compruebas qué hace tu código con ella.

En Admin esProbar en una sandbox con un usuario de prueba en lugar del cliente real

✓ En esta sub-lección

  1. 01Escribir un HttpCalloutMock que devuelva una respuesta preparada.
  2. 02Registrarlo con Test.setMock antes de que el código llame fuera.
  3. 03Probar qué hace tu código con la respuesta.

La nutria: ¿Te acuerdas? · Repaso de la lección 5

¿Para qué sirve Assert.fail justo después de la llamada, dentro del try?

ErpSyncJob, el Queueable del Módulo 9, llama al ERP y después marca las renovaciones como enviadas. Si lo ejecutas en un test tal cual, falla: los métodos de test no pueden hacer callouts. Y aunque pudieran, no querrías que cada despliegue mandara renovaciones de prueba al ERP de verdad.

Un ERP de mentira

Apex
private class ErpOkMock implements HttpCalloutMock {
    public HttpResponse respond(HttpRequest req) {
        HttpResponse res = new HttpResponse();
        res.setStatusCode(200);
        res.setBody('{"received": true}');
        return res;
    }
}

Test.setMock(HttpCalloutMock.class, new ErpOkMock());   // desde aquí, cada callout lo contesta el mock
HttpCalloutMock es otra interfaz con un solo método: respond. Recibe la petición que tu código iba a enviar y devuelve la respuesta que tú decidas.

Con Test.setMock, cuando el código ejecuta http.send(req), no sale nada de Salesforce: el contesta. Así pruebas lo que de verdad es tuyo, qué haces con la respuesta. Y puedes tener varios mocks: uno que responde 200, otro que responde 500 y otro que lanza una CalloutException, para probar también qué pasa cuando el ERP falla.

ErpSyncJob
http.send(req)
ERP de mentira
Ejecuta el test con y sin mock, y con un ERP que responde bien o que falla.

La nutria: Tu usuario de prueba, pero para sistemas

Cuando probaba en una sandbox, nunca usaba el correo de un cliente real: creaba un contacto de prueba para que los emails no llegaran a nadie. Un mock es ese contacto de prueba para el ERP: el código hace exactamente lo mismo, pero la llamada no sale.

La nutria: ¿Y por qué no un Flow? Porque el callout vive donde Flow no prueba

En un flow desencadenado por registro, el callout HTTP va en el camino asíncrono, y los tests de Flow no admiten caminos asíncronos. Esa parte del flow se despliega sin probar. En Apex, HttpCalloutMock te deja probar la llamada, la respuesta buena y la mala antes de que nada llegue a producción.