Skip to main content

Testing Http call out using StaticResourceCalloutMock

I was working with the Http call out stuff lately and have a chance to learn on how to execute test class on this type of class.Test class...not my favorite subject in salesforce but it is very important :).

I did some googling stuff and also bump into implementation of HttpCallout mock interface-- it was like phew! But I also bumped into other option which is StaticResourceCalloutMock and MultiStaticResourceCalloutMock which seem pretty easier.

Okay let's get started!

What is StaticResourceCalloutMock?
Built-in class used to test our callouts by specifying the response body in Static Resource.

Why?
Easy instead of implement code using HttpCalloutMock interface.We just create dump response file in Static Resource then instantiate the StaticResourceCalloutMock.

Scenario:
I have class that call webservice from other server in order to get the token.It call the webservice using Http call out.So in order to let it deployed beautifully in production , I need to get higher 75% mark in test coverage.

This is the class that using Http call out.

public class GetTokenClass {
 
 public Integer statusCode ;
 public String errorMessage;

   public String getToken()

    {
     String baseUrl='www.myDomain.com/2.0/Authentication/SalesForce';
 
       HTTPRequest r = new HTTPRequest();              
       r.setEndpoint(baseURL);
       r.setMethod('POST');
       r.setTimeout(120000);
      
        HTTP http = new HTTP();
        HTTPResponse response = http.send(r);      
        XmlStreamReader reader = response.getXmlStreamReader();
               
       String  accessToken = '';
   
        if(response.getStatusCode()!=200){
           errorMessage=response.getStatusCode() +' : '+ response.getStatus();
          
         }
        else {
         while(reader.hasNext()) { 
          if (reader.getEventType() == XmlTag.START_ELEMENT) {
             if(reader.getLocalName() == 'input'){               
                string token_id = reader.getAttributeValue(null, 'id');
  
             if(token_id == 'access_token')
                  {
                      accessToken = reader.getAttributeValue(null, 'value');
                  }
              }
          }
         reader.next();
         }
        }
         statusCode=response.getStatusCode();
        
        return accessToken;
}
}

So these are the steps that I need to do in order to use StaticResourceCalloutMock .

1) Create Static Resource that contain the response body.In my case, I need to retrieve xml file.So I will upload xml file below in Static Resource.I put the name as TokenTest.




 2)Create the test class, specify the Static Resource name that previously upload.
@isTest
public class MyTestClass {
static testMethod  void testGetToken(){
     GetTokenClass  controller = new GetTokenClass();
     StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
     mock.setStaticResource('TokenTest');
        mock.setStatusCode(200);
        mock.setHeader('Content-Type', 'text/xml');
        
        Test.startTest();
        Test.setMock(HttpCalloutMock.class, mock);
     controller.getToken();
     Test.stopTest();
 }
}


 3)Run the test classs.That's all.

 Note:If we have many call out in one class- we might want to consider MultiStaticResourceCalloutMock. 

References Testing HTTP Callouts Using Static Resources

Comments

Popular posts from this blog

Search Solution Basics

When is it a good time to create a customized search solution? You're developing an external knowledge base for user support. You're in the mood for a fun Friday night. The sales reps just started using the Sales Cloud in Lightning Experience. You want to put your company branding in the search bar. What differentiates SOSL from SOQL? Syntax SOSL searches the search index instead of the org database. SOSL searches more efficiently when you don't know in which object the data resides. All of the above. SOSL works with: REST only SOAP only REST, SOAP, and Apex SOQL only What does a search for a single object look like in SOSL? FIND {cloud} RETURNING Account FIND in ACCOUNT RETURNING "cloud" FIND "cloud" in ACCOUNT FIND (cloud) RIGHT NOW! What does a search for multiple objects look like in SOSL? FIND {sneakers} RETURNING ALL ARTICLES FIND {sneakers} in ALL OBJECTS FIND {sneakers} RETURNING Product2, Content

Process Builder is not fired when field update is called from Approval Process

Scenario In Final Approvals section ; in Approval Process we have field update to update Status field. In Process Builder , we have some action that need to be done when Status field is updated in Approval Process.However this process builder is not fired. Solution To handle this, in Field Update in Approval Process , check Re-evaluated Workflow Rules after Field Change as picture below. What happen if field updated from Approval Process. Workflow - does not fires untill Re-evaluate workflow checkbox is ticked on your field update Process Builder - does not fires untill Re-evaluate workflow checkbox is ticked on your field update Trigger - will fire if conditions are matched This is explained in article here  . Field Updates That Re-evaluate Workflow Rules If  Re-evaluate Workflow Rules After Field Change  is enabled for a field update action, Salesforce  re-evaluates all workflow rules on the object if the field update results in a change to the value of the fi

Tips and Tricks : Test class for Invocable method

Issue : I got 100% coverage in my sandbox but when run validation for deployment it returns 0% coverage It turn out that in my sandbox, I am depending on Process Builder to Invocable Apex class, as long I manipulate test data that fire Process Builder it will call Invocable class. This is not useful when deploying it to Production although it gets deployed together with Process Builder. The correct way is to direct call Invocable method inside test class itself. Example of class : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 global class MyCustomObject_StatusUpdate_Util { @InvocableMethod ( label = ' Update Quote Status ' ) public static void updateQuote ( Request [] requests ) { Set < Id > setOppId = new Set < Id >(); List < SBQQ__Quote__c > listQuoteToUpdate = new List < SBQQ__Quote__c >(); for ( Request request : requests ) {