function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
andy81andy81 

code coverage help with json parser

I have created a class which helps to automatically update a geolocation field. I have also given the test class but the code coverage is only 72%. below is the code and test class. The lines of code which is in bold are not covered by the test class. Can anyone help with writing test class.

public class AccountGeocodeAddress{
// static variable to determine if geocoding has already occurred
private static Boolean geocodingCalled = false;
// wrapper method to prevent calling future methods from an existing future context
public static void DoAddressGeocode(id
accountId) {
  if
(geocodingCalled || System.isFuture()) {
    System.debug(LoggingLevel.WARN, '***Address Geocoding Future Method Already Called - Aborting...');
    return;
  }
  // if not being called from future context, geocode the address
  geocodingCalled = true;
  geocodeAddress(accountId);
}
// we need a future method to call Google Geocoding API from Salesforce
@future (callout=true)
static private void geocodeAddress(id accountId)

  // Key for Google Maps Geocoding API
  String geocodingKey = 'AIzaSyAYPyw3l--jV92bEfgq20vfAggygvqiIPg';
  // get the passed in address
  Account geoAccount = [SELECT BillingStreet, BillingCity, BillingState, BillingCountry, BillingPostalCode FROM Account WHERE id = :accountId];
    
  //check that we have enough information to geocode the address
  if((geoAccount.BillingStreet == null) || (geoAccount.BillingCity == null)) {
    System.debug(LoggingLevel.WARN, 'Insufficient Data to Geocode Address');
    return;
  }
  //create a string for the address to pass to Google Geocoding API
  String geoAddress = '';
  if(geoAccount.BillingStreet != null)
    geoAddress += geoAccount.BillingStreet + ', ';
  if(geoAccount.BillingCity != null)
    geoAddress += geoAccount.BillingCity + ', ';
  if(geoAccount.BillingState != null)
    geoAddress += geoAccount.BillingState + ', ';
  if(geoAccount.BillingCountry != null)
    geoAddress += geoAccount.BillingCountry + ', ';
  if(geoAccount.BillingPostalCode != null)
    geoAddress += geoAccount.BillingPostalCode;
  
  //encode the string so we can pass it as part of URL
  geoAddress = EncodingUtil.urlEncode(geoAddress, 'UTF-8');
  //build and make the callout to the Geocoding API
  Http http = new Http();
  HttpRequest request = new HttpRequest();
  request.setEndpoint('https://maps.googleapis.com/maps/api/geocode/json?address=' + geoAddress + '&key=' + geocodingKey + '&sensor=false');
  request.setMethod('GET');
  request.setTimeout(60000);
  try {
    //make the http callout
    HttpResponse response = http.send(request);
    //parse JSON to extract co-ordinates
    JSONParser responseParser = JSON.createParser(response.getBody());
    //initialize co-ordinates
    double latitude = null;
    double longitude = null;
    while(responseParser.nextToken() != null) {
      if((responseParser.getCurrentToken() == JSONToken.FIELD_NAME) && (responseParser.getText() == 'location')) {
        responseParser.nextToken();
        while(responseParser.nextToken() != JSONToken.END_OBJECT) {
         
        String locationText = responseParser.getText();
         
        responseParser.nextToken();
         
        if (locationText == 'lat')
           
        latitude = responseParser.getDoubleValue();
         
        else if (locationText == 'lng')
           
        longitude = responseParser.getDoubleValue();
        }
      }
    }
    //update co-ordinates on address if we get them back
    if(latitude != null) {
      geoAccount.Location__Latitude__s = latitude;
      geoAccount.Location__Longitude__s = longitude;
      update geoAccount;
    }

  } catch
(Exception e) {
    System.debug(LoggingLevel.ERROR, 'Error Geocoding Address - ' + e.getMessage());
  }
}
}

Test Class

@IsTest 
public class KioskGeocodeAddressTest {
    Static testMethod void testkioskGeocodeAdress(){
        FuseBox_Kiosk_Address__c kiosk = new FuseBox_Kiosk_Address__c(Name = 'Test');
        kiosk.Street_Name__c = '4500 Truxel rd';
        kiosk.Address_Line_2__c = 'Apt 1015';
        kiosk.City__c = 'Sacramento';
        Kiosk.State__c = 'California';
        Kiosk.Zip_Code__c = '95833';
        kiosk.Country__c = 'United States';
        insert kiosk;
        test.startTest();
        string status;
        HttpRequest request = new HttpRequest();
        StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
        mock.setStaticResource('GoogleMapsAPI');
        mock.setStatusCode(200);
        mock.setHeader('Content-Type', 'application/json');
        mock.respond(request);
        HttpResponse response = new HttpResponse();
        JSONParser responseParser = JSON.createParser(response.getBody());
        String Loc = responseParser.getText();
        double latitude = 33.33333;
        double longitude;
        // Set the mock callout mode
        Test.setMock(HttpCalloutMock.class, mock);
                 
        // Call the method that performs the callout
        kioskGeocodeAddress.DoAddressGeocode(kiosk.Id);
        system.assertNotEquals(latitude,kiosk.Location__Latitude__s);
    }
}
Suresh(Suri)Suresh(Suri)
Hi Andy,

Did you get solution for the above test class.Am also facing same issue need to cover json part from as you mectioned.

If you already got any solution can you share it will helpful for me.

Thanks in advance.
Suresh(Suri)Suresh(Suri)
Hi Andy,
I got the solution please check my updated code in set body am passing location like this way
if you are facing same issue please check my code.
res.setBody('{"name":"testrec","billingcountry":"United States","BillingState":"New Jersey","BillingCity":"California","BillingPostalcode":"07010","location":{'+'"lat" : 37.79410130,'+'"lon":-122.39510960'+'}}');

Thanks