5

I am pretty new to Apex and trying to learn as much as possible. Any help would be really appreciated. I have two classes.

  1. Invokeable Apex Class: This class is just getting called by a Process (Builder) if lead object meets certain criteria and sending the lead record values like , ID, email, First Name, Last name to another class which is Future Callout class.

  2. @future Apex class is calling a POST rest API (sending the lead data) to an external system and receiving an ID which updates the lead record.

Both the classes are working as expected. I am trying to create Apex Test Class for Both of them but facing issues as i never wrote apex Test class earlier.

Here are the classes

1- Invokable class

public class MakeCallout {

    @InvocableMethod
    public static void invokeleadcallout(list<Lead> Leads) {

        //below is the Futurecallout Method
        WS_Lead.Notification(Leads[0].id, Leads[0].Email, Leads[0].Firstname);
    }
}

2- WS callout class

global class WS_Lead {
  @future (callout=true)
   // Receiving the Lead details from Invokable class ApexCallout.
  WebService static void Notification(id lid, String name)
        { 
        HttpRequest req = new HttpRequest();
        HttpResponse res = new HttpResponse();
        Http http = new Http();

        req.setEndpoint('https://google.com');

        //Setting Method Content and Body
        req.setMethod('POST');
        req.setHeader('Content-Type','application/x-www-form-urlencoded');
        req.setBody(
        'name='+EncodingUtil.urlEncode(name, 'UTF-8')

      );
        req.setTimeout(120000);
        try {
         res = http.send(req);
         System.debug(res.getbody());

         Dom.Document docx = new Dom.Document();
         docx.load(res.getbody());
         dom.XmlNode xroot = docx.getrootelement();
         String U_Id = xroot.getAttributeValue('U_Id', null);
         system.debug(U_Id );
         Lead le = new Lead(id=lid);
         le.ID__c = U_Id;
         update le;
        } 
        catch(System.CalloutException e) {
            System.debug('Callout error: '+ e);
            System.debug(res.toString());
            res.getbody();
               }
            }
       }
2
  • Can you please mark the answer as accepted so I can award a bounty to sfdcfox
    – Eric
    Commented Mar 6, 2017 at 17:21
  • @AdrianLarson - If I add a bounty to reward sfdcfox will the entire amount be given to him or only half since it is not accepted?
    – Eric
    Commented Mar 6, 2017 at 17:22

1 Answer 1

13

Basically, you need to know about how to test HTTP callouts, and how to test future methods.

Once you've gotten that far, you'll see that the unit test would look like:

@isTest class MakeCalloutTest {
    // Simple echo callout class
    // Returns whatever response we tell it to when asked
    class EchoHttpMock implements HttpCalloutMock {
        HttpResponse res;
        EchoMock(HttpResponse r) {
            res = r;
        }
        // This is the HttpCalloutMock interface method
        public HttpResponse respond(HttpRequest req) {
            return res;
        }
    }

    @isTest static void test() {
        // Avoid using live data
        List<Lead> leads = new List<Lead>{ new Lead(LastName='Test',Company='test') };
        insert leads;
        // We tell it what to simulate
        HttpResponse res = new HttpResponse();
        res.setBody('<?xml version="1.0" encoding="utf-8"?><root U_Id="12345"></root>');
        res.setStatusCode(200);
        // This allows the callout to succeed
        Test.setMock(HttpCalloutMock.class, new EchoHttpMock(res));
        // Start the test
        Test.startTest();
        // Enqueue the future call
        MakeCallout.invokeleadcallout(leads);
        // Trigger future method
        Test.stopTest();
        // Verify logic
        leads = [select id__c from lead];
        System.assertEquals('12345', leads[0].Id__c);
    }
}

Note: This doesn't cover the "catch" part of your try-catch block. Once you've gotten as far as covering most of your code, the catch block should be pretty simple (hint: you can construct and throw CalloutException manually from a HttpCalloutMock).

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .